簡體   English   中英

如何在 Android 中播放音頻文件?

[英]How do I play an audio file in Android?

我有代碼來播放我從互聯網下載的.ogg音頻文件。 我沒有錯誤,所以我可以運行它,但是應用程序崩潰了:

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;
}
}

我想我有兩個問題:

  1. 我把它放在main.xml文件中:

    \n <?xml version="1.0" encoding="utf-8"?>\n <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\n android:orientation="垂直" android:layout_width="fill_parent"\n android:layout_height="fill_parent">\n <TextView android:text="點擊屏幕開始播放"\n     android:id="@+id/textView1" android:layout_width="fill_parent"\n     android:layout_height="fill_parent"></TextView>\n </線性布局>\n
    而且我不知道它是否正確。

  2. 我將文件sound1.ogg放在workspace->SoundPlay2文件夾中,因為在 res 文件夾中我遇到了問題,而且我嘗試將它放在存在的兩個 res 文件夾中。

這是來自我的控制台:

[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] res\layout\main.xml:0: error: Resource entry main is already defined.
[2012-01-04 19:52:34 - PlaySound2] res\layout\main.out.xml:0: Originally defined here.
[2012-01-04 19:52:34 - PlaySound2] C:\Users\Natalia\workspace\PlaySound2\res\layout\main.out.xml:1: error: Error parsing XML: no element found

我從“ Android Sounds - Tutorial ”中獲取了這個示例。 我想播放一個音頻文件,更具體地說,是一個.wav文件。

我不知道在哪里可以找到有關 MediaPlayer 類中允許的文件及其特征(持續時間、采樣率...)的一些信息,您能告訴我在哪里可以找到嗎?

在 res 文件夾中創建 raw 文件夾並將您的文件添加到其中。 然后使用播放文件

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

也請參閱這篇文章了解您的 main.xml 問題。

我以前從未見過類 SoundPool,但是我建議使用 MediaPlayer 類:

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

確保將文件放入文件夾 PROJECT/res/raw/(如果不存在則創建它)

您的 main.xml 也有問題。 請問可以發一下嗎?

播放某種蜂鳴器的示例。 在原始文件夾下的 res 文件夾中,我有一個 buzzer.wav

播放此蜂鳴器的方法:

     /**
 * 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();
        }

    });

}

首先你需要將sound1.ogg文件保存在src\\main\\res\\raw目錄中

設置直接傳遞“sound1.ogg”文件,以這種方式傳遞文件R.raw.sound1

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

這不是 OnClickListener 的實現方式,這是在類中實現的接口,而不是強制轉換為。 您這樣做是為了快速修復,但由於 AudioManager 首先運行,所以您認為這是錯誤的。

老實說,我總是更喜歡 Mediaplayer 而不是任何其他 api。下載文件后將其保存到外部存儲或原始文件夾並使用給定的方法播放,或者您可以直接從互聯網播放。 注意:小心緩沖

要直接從互聯網播放音頻,請添加這些代碼。 注意:API 版本 >= 21 並確保在清單中添加互聯網權限

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)//This method requires android version more than 20
    public void playSoundFrom_internet(String url) {
        MediaPlayer mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioAttributes(
                new AudioAttributes.Builder()
                        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                        .setUsage(AudioAttributes.USAGE_MEDIA)
                        .build()
        );
        try {
            mediaPlayer.setDataSource(url);
            mediaPlayer.prepare(); // might take long! (for buffering, etc)
            mediaPlayer.start();
        }catch(IOException E){
            E.printStackTrace();
        }
    }

從 res 文件夾播放音頻:

    public void playSoundFrom_raw(@RawRes int rawId, Context context){
        MediaPlayer mediaPlayer = MediaPlayer.create(context,rawId);
        mediaPlayer.start();
    }

從文件播放音頻。 注意:確保添加存儲權限

    public void playSoundFrom_file(String filePath){
        try {
            MediaPlayer mediaPlayer = new MediaPlayer();
            mediaPlayer.setDataSource(filePath);
            mediaPlayer.prepare();
            mediaPlayer.start();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM