25

我是 Android 开发的新手,我有一个问题/问题。

我正在玩 MediaPlayer 类来重现一些声音/音乐。我正在玩原始资源(res/raw),它看起来很容易。

要播放原始资源,必须像这样初始化 MediaPlayer:


MediaPlayer mp = MediaPlayer.create(appContext, R.raw.song);
mp.start();

直到这里没有问题。播放声音,一切正常。当我想向我的应用程序添加更多选项时,我的问题出现了。特别是当我添加“停止”按钮/选项时。

基本上,我想做的是......当我按下“停止”时,音乐停止。当我按下“开始”时,歌曲/声音重新开始。(非常基本!)

要停止媒体播放器,您只需调用stop(). 但要再次播放声音,必须重新设置媒体播放器并做好准备。


mp.reset();
mp.setDataSource(params);
mp.prepare();

问题是该方法setDataSource()只接受文件路径、内容提供者 URI、流媒体 URL 路径或文件描述符作为参数。

所以,由于这个方法不接受资源标识符,我不知道如何设置数据源以便调用prepare(). 另外,不明白为什么不能使用Resouce标识符来设置数据源,但是初始化MediaPlayer的时候可以使用资源标识符。

我想我错过了一些东西。我想知道我是否在混合概念,并且stop()不必在“停止”按钮中调用该方法。有什么帮助吗?

提前致谢!!!

4

7 回答 7

27

这是我使用单个 MediaPlayer 加载多个资源的操作:

/**
 * Play a sample with the Android MediaPLayer.
 *
 * @param resid Resource ID if the sample to play.
 */
private void playSample(int resid)
{
    AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);

    try
    {   
        mediaPlayer.reset();
        mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
        mediaPlayer.prepare();
        mediaPlayer.start();
        afd.close();
    }
    catch (IllegalArgumentException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }
    catch (IllegalStateException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }
    catch (IOException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }

mediaPlay 是一个成员变量,在类的其他点创建和释放。这可能不是最好的方法(我自己是 Android 新手),但它似乎有效。请注意,在 mediaPlayer 完成播放之前,代码可能会落到方法的底部。如果你需要播放一系列资源,你仍然需要处理这种情况。

于 2010-08-30T18:31:56.663 回答
16

这就是MediaPlayer.create方法打开原始文件的方式:

    public static MediaPlayer create(Context context, int resid) {
         try {
             AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
             if (afd == null) return null;

             MediaPlayer mp = new MediaPlayer();
             mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
             afd.close();
             mp.prepare();
            return mp;
        } catch (IOException ex) {
            Log.d(TAG, "create failed:", ex);
            // fall through
        } catch (IllegalArgumentException ex) {
            Log.d(TAG, "create failed:", ex);
           // fall through
        } catch (SecurityException ex) {
            Log.d(TAG, "create failed:", ex);
            // fall through
        }
         return null;
    }
于 2011-01-21T16:55:21.887 回答
9

或者,您可以通过以下方式访问资源:

mediaPlayer.setDataSource(context, Uri.parse("android.resource://com.package.name/raw/song"));

其中 com.package.name 是您的应用程序包的名称

于 2011-09-27T12:26:27.657 回答
4

您可以使用

mp.pause();
mp.seekTo(0);

停止音乐播放器。

于 2010-06-13T10:19:46.897 回答
3

最后,它对我有用的方式:

public class MainStart extends Activity {

    ImageButton buttonImage;
    MediaPlayer mp;
    Boolean playing = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main);

        buttonImage = (ImageButton)findViewById(R.id.ButtonID);


        buttonImage.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                if(playing){
                    mp.stop();
                    playing = false;
                }else{
                    mp = MediaPlayer.create(getApplicationContext(), R.raw.sound_u_want);
                    mp.start();
                    playing = true;
                }
            }
        });
    }
}
于 2012-05-11T14:47:42.800 回答
0

先生。矩形,这个消息可能为时已晚,但我自豪地为你的想法写了这些代码:我拥有mp并且mediaplayersescal9一个button.

....
if(btnClicked.getId() == sescal9_ornek_muzik.getId())
        {
            mp.start();
            mp.seekTo(380);
            mp2.start();
            mp2.seekTo(360);
            mp3.start();
            mp3.seekTo(340);
            ...
            }
于 2013-09-16T11:40:17.020 回答
0

重新检查您的传递参数不为空

可能的原因

  1. 上下文可能为空
  2. 您的媒体文件可能已损坏
于 2020-01-30T09:21:47.763 回答