How do I play an audio file in Android?

I have code to play an .ogg audio file, that I downloaded from the internet. I have no errors, so I can run it, but then the app crashes:

package play.my.sound;

import android.app.Activity;
import android.media.AudioManager;
import android.media.SoundPool;
import android.media.SoundPool.OnLoadCompleteListener;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;

public class PlaySound2Activity extends Activity {
private SoundPool soundPool;
private int soundID;
boolean loaded = false;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    View view = findViewById(R.id.textView1);
    view.setOnClickListener((OnClickListener) this);
    // Set the hardware buttons to control the music
    this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
    // Load the sound
    soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
    soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
        public void onLoadComplete(SoundPool soundPool, int sampleId,
                int status) {
            loaded = true;
        }
    });
    soundID = soundPool.load("sound1.ogg", 1);

}

public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        // Getting the user sound settings
        AudioManager audioManager = (AudioManager) getSystemService    (AUDIO_SERVICE);
        float actualVolume = (float) audioManager
                .getStreamVolume(AudioManager.STREAM_MUSIC);
        float maxVolume = (float) audioManager
                .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        float volume = actualVolume / maxVolume;
        // Is the sound loaded already?
        if (loaded) {
            soundPool.play(soundID, volume, volume, 1, 0, 1f);
            Log.e("Test", "Played sound");
        }
    }
    return false;
}
}

I think I have two problems:

  • I put this in the main.xml file:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView android:text="Click on the screen to start playing"
        android:id="@+id/textView1" android:layout_width="fill_parent"
        android:layout_height="fill_parent"></TextView>
    </LinearLayout>
    
    And I don't know if it's correct.

  • I put the file sound1.ogg in the workspace->SoundPlay2 folder because in the res folder I had problems, and also, I tried to put it in the two res folders that exist.

  • This is from my console:

    [2012-01-04 19:38:16 - PlaySound2] Failed to install PlaySound2.apk on device 'emulator-5554': timeout
    [2012-01-04 19:38:16 - PlaySound2] Launch canceled!
    [2012-01-04 19:47:33 - PlaySound2] Error in an XML file: aborting build.
    [2012-01-04 19:52:34 - PlaySound2] reslayoutmain.xml:0: error: Resource entry main is already defined.
    [2012-01-04 19:52:34 - PlaySound2] reslayoutmain.out.xml:0: Originally defined here.
    [2012-01-04 19:52:34 - PlaySound2] C:UsersNataliaworkspacePlaySound2reslayoutmain.out.xml:1: error: Error parsing XML: no element found
    

    I took this example from "Android Sounds - Tutorial". I want to play an audio file, more specifically, a .wav file.

    I dont' know where I can find some information about the files that are permitted in the MediaPlayer class and their characteristic (durantion, sample rate...) Could you tell me where I can find this??


    Create raw folder in the res folder and add your file to it. Then play the file using

    soundID = soundPool.load(R.raw.sound1, 1);
    

    And also see this post for your main.xml problem.


    Example for playing some kind of buzzer. In the res folder under raw folder I have a buzzer.wav

    Method to play this buzzer:

         /**
     * Method to play an alarm sound to signal half time or full time.
     */
    private void playAlarm() {
        MediaPlayer mp = MediaPlayer.create(this,
                R.raw.buzzer);
        mp.start();
        mp.setOnCompletionListener(new OnCompletionListener() {
    
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.release();
            }
    
        });
    
    }
    

    I've never seen the Class SoundPool before, however I would recommend using a MediaPlayer Class:

    mMediaPlayer = new MediaPlayer(this, R.raw.yourfile);
    mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mMediaPlayer.prepare();
    mMediaPlayer.start();
    

    Make sure you put the file into the folder PROJECT/res/raw/ (or create it if it does not exist)

    Also there is something wrong with your main.xml. Can you please post it?

    链接地址: http://www.djcxy.com/p/16650.html

    上一篇: 如何在视图下添加布局

    下一篇: 如何在Android中播放音频文件?