如何在安卓系统中播放音频文件?

20 人关注

我有代码要播放一个 .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;

我想我有两个问题。

  • 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.
  • 我把文件 sound1.ogg 放在 workspace->SoundPlay2 文件夹里,因为在res文件夹里我遇到了问题,而且,我还试图把它放在存在的两个res文件夹里。

  • 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] 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
    

    我从""中提取了这个例子。安卓声音 - 教程". 我想播放一个音频文件,更确切地说,是一个.wav文件。

    我不知道在哪里可以找到一些关于允许在MediaPlayer类中使用的文件及其特征(持续时间、采样率......)的信息,你能告诉我在哪里可以找到这些信息么?

    2 个评论
    这是我在日志猫中遇到的第一个错误。E/AndroidRuntime(739): java.lang.RuntimeException:Unable to start activity ComponentInfo{play.my.sound/play.my.sound.PlaySound2Activity}: java.lang.ClassCastException: play.my.sound.PlaySound2Activity cannot be cast to android.view.View$OnClickListener
    你为什么不在谷歌上简单搜索一下,找到简单的答案。在谷歌上简单搜索一下 "支持的音频格式",得到的结果是 developer.android.com/guide/appendix/media-formats.html . developer.android.com/guide/topics/media/mediaplayer.html
    java
    android
    Natiya
    Natiya
    发布于 2012-01-05
    6 个回答
    manjusg
    manjusg
    发布于 2018-06-03
    已采纳
    0 人赞同

    在res文件夹中创建raw文件夹,将你的文件添加到其中。 然后用以下方法播放该文件

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

    还可以看到这个post为你的main.xml问题。

    我写了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类,甚至是安卓2.3以上版本的本地音频apis。
    Force
    Force
    发布于 2018-06-03
    0 人赞同

    我以前从未见过SoundPool类,然而我建议使用MediaPlayer类。

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

    确保你把文件放到PROJECT/res/raw/文件夹中(如果不存在,则创建它)。

    另外,你的main.xml也有问题。能否请你把它贴出来?

    能否告诉我,我必须删除或改变我的代码的哪一部分来插入这个?
    说实话,如果你不知道该怎么改,你就不了解自己的代码。删除所有与你的Soundpool互动的行,然后读这个。 developer.android.com/reference/android/media/MediaPlayer.html
    BobMcboberson
    BobMcboberson
    发布于 2018-06-03
    0 人赞同

    播放某种蜂鸣器的例子。在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文件时,它就不工作了。关于这一点,有什么规范需要我知道吗?谢谢!!
    Venki WAR
    Venki WAR
    发布于 2018-06-03
    0 人赞同

    首先你需要保存 sound1.ogg file in srcmain\resraw directory

    替换为直接传球 "sound1.ogg" 文件,以这种方式传递文件 R.raw.sound1

    soundID = soundPool.load(R.raw.sound1, 1);
        
    Programmerabc
    Programmerabc
    发布于 2018-06-03
    0 人赞同

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

    要直接从互联网上播放音频,请添加这些代码。 Note: Api version >= 21 and make sure to add internet permission in manifest

        @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();