在安卓设备中播放mp3文件遇到问题

3
我在播放音频(mp3)文件时遇到问题,这些音乐文件就像点击声音,它们存在原始文件夹中。问题是如果有很多点击在随机时间间隔内,则会抛出nullPointer异常。它可以在任何时候发生,是否与内存问题或MediaPlayer相关问题有关,请给出任何建议。这只是一个简单的媒体播放器对象调用,但它是一个游戏,所以当触摸它时它会播放文件,在游戏中我有许多需要拖动的东西,所以我想在那时发出点击声。有时它能正常工作,但当超过一定限制时它会抛出null pointer exceptions。以下是代码:
   MediaPlayer mp= MediaPlayer.create(context,R.raw.soun1);
   mp.start();

thats it:


1
把你的代码放在这里,这样我们才能帮助你。 - Nikunj Patel
我已经发布了我的答案,请尝试一下。 - Nikunj Patel
你是否每次想播放声音时都创建一个 MediaPlayer 对象? - K-ballo
是的。我尝试过创建onCreate(),但它会抛出一个错误。 - mayank_droid
4个回答

1

试试这个::

MediaPlayer mp = new MediaPlayer();
    mp= MediaPlayer.create(this,R.raw.soun1);
    mp.start();

清单文件中的权限:::

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

1
为什么要创建一个默认构造的MediaPlayer,如果你马上就要失去它呢? - K-ballo
为什么在所有操作都在手机存储器上完成时,需要声明外部存储器的权限? - mayank_droid
正如您所知,您需要授予权限才能将数据存储在SD卡中,就像这样。这就像是外部的一部分。 - Nikunj Patel

1
为了播放媒体,我们需要两个类。假设mainactivity.java是我们的第一个文件。在这里,我们定义了两个按钮——start_buttonstop_button。请保留HTML标签。
mButton_start.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        Intent mIntent=new Intent(MainActivity.this,maservice.class);
        startService(mIntent);

    }
});
mButton_stop.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        Intent mIntent=new Intent(MainActivity.this,maservice.class);
        stopService(mIntent);

    }
});

maservice.java是我们的另一个Java文件。在这里,我们定义了媒体播放器,并且应该有3个方法:onCreate(),onStart()和onDestroy()。

以下是代码:

MediaPlayer mPlayer;
@Override
public void onCreate()
{
    super.onCreate();
    mPlayer=MediaPlayer.create(this, R.raw.kyun);
    mPlayer.setLooping(true);
}
@Override
public void onStart(Intent miIntent, int startid)
{
    super.onStart(miIntent, startid);
    mPlayer.start();

}

@Override
public void onDestroy()
{
    super.onDestroy();
    mPlayer.stop();
}

我们还需要在清单文件中定义这些Java文件。
  • mainactivity.java 在 activity 标签下定义
  • 而 maservice.java 在 service 标签下定义

在我的情况下,在onCreate中启动mediaPlayer是问题所在。我看到了你的代码,并通过在onStart中开始进行修复。谢谢。 - hojjat reyhane

0

我得到了答案,它是SoundPool,特别是在像游戏这样的应用程序中连续使用声音文件的情况下,我们应该使用SoundPool而不是MediaPlayer。


0
问题出在 MP3 编码上。我尝试使用相同的代码,有些可以工作,有些则不行。所以如果下次出现相同的错误,请尝试使用另一个编码。

问题不在于mp3编码,实际上是系统的问题。当您不断播放声音时,媒体播放器返回null,每次创建媒体播放器实例都会导致错误。因此,特别是对于游戏,Android提供了SoundPool API。 - mayank_droid
Android开发者网站表示,如果对象为空,则无法创建该对象。http://developer.android.com/reference/android/media/MediaPlayer.html#create%28android.content.Context,%20int%29 - mayank_droid
不,我在Activity中写了两行代码,只是播放一次..音频大约30秒。但它根本没有播放。当将mp3更改为其他文件时,它立即播放。 - nithinreddy
我并不是说播放mp3文件会有问题,我是说如果频繁地播放任何短但经常使用的文件,那么创建媒体播放器对象时就会出现问题。而你只是在说它有时候播放有时候不播放。而且,对于你最好的了解,使用SoundPool也有助于内存管理。看一下两个API,自己考虑需要什么。如果你不经常使用文件,那么MediaPlayer并且没有内存问题对你来说更好,但对我来说当时不是一个好选择。 - mayank_droid
如果您使用更压缩的版本来替代mp3,也许是正确的选择。我不知道为什么会出现问题并返回空指针异常,但我找到了解决方案,因为我的应用程序是一个小游戏类型,所以我使用了SoundPool,因为它可以压缩音乐文件并一次性加载到内存中。 - mayank_droid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接