【问题标题】:How do I play an audio file in Android?如何在 Android 中播放音频文件?
【发布时间】:2012-02-02 16:11:32
【问题描述】:

我有代码可以播放我从互联网上下载的.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 文件中:

    线性布局> 而且我不知道它是否正确。
  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 类中允许的文件及其特征(持续时间、采样率...)的一些信息,您能告诉我在哪里可以找到吗??

【问题讨论】:

标签: java android


【解决方案1】:

说实话,我总是更喜欢 Mediaplayer 而不是任何其他 api。下载文件后将其保存到外部存储或原始文件夹并使用给定的方法播放,或者您可以直接从互联网播放。注意:小心缓冲

要直接从 Internet 播放音频,请添加这些代码。 注意: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();
        }

    }

【讨论】:

    【解决方案2】:

    这不是 OnClickListener 的实现方式,而是在类中实现的接口,而不是强制转换为。您这样做是为了快速解决问题,但由于 AudioManager 首先运行,所以您认为这是错误的。

    【讨论】:

      【解决方案3】:

      首先你需要将sound1.ogg文件保存到src\main\res\raw目录

      设置直接传"sound1.ogg"文件,这样传文件R.raw.sound1

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

      【讨论】:

        【解决方案4】:

        在 res 文件夹中创建 raw 文件夹并将您的文件添加到其中。然后使用

        播放文件
        soundID = soundPool.load(R.raw.sound1, 1);
        

        对于您的 main.xml 问题,另请参阅 post

        【讨论】:

        • 我写了 soundID = soundPool.load(R.raw.sound1, 1);但出现错误儿子我已经通过 soundID = soundPool.load(this, R.raw.sound1, 1); 更改并且没有出现错误,但是当我运行它时,应用程序崩溃了!!
        • view.setOnClickListener((OnClickListener) this);.此行崩溃是因为您尚未实现 View.onclicklistner。为活动实现接口 View.onclicklistner。
        • 查看您从中获取代码的教程。他们已经实现了 Ontouchlistener。逐行比较你的代码。
        • Soundpool 主要用于游戏。就像在战争游戏中产生爆炸声一样。如果要播放文件或流。您应该更好地使用 Mediapalyer 类,甚至是从 android 2.3 开始提供的原生音频 api。
        【解决方案5】:

        我以前从未见过 SoundPool 类,但我建议使用 MediaPlayer 类:

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

        确保将文件放入文件夹 PROJECT/res/raw/(如果不存在则创建)

        您的 main.xml 也有问题。可以发一下吗?

        【讨论】:

        【解决方案6】:

        播放某种蜂鸣器的示例。在 raw 文件夹下的 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();
                }
        
            });
        
        }
        

        【讨论】:

        • 这个方法只能播放.wav文件吗??我在哪里将它添加到我的代码中?谢谢!!
        • 我做过类似的事情,但我使用的是 .ogg 文件。当我引入 .wav 文件时,它不起作用。我必须知道这方面的任何规范吗?谢谢!!
        猜你喜欢
        • 2011-11-09
        • 1970-01-01
        • 1970-01-01
        • 2017-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多