MediaPlayer,原始资源,停止和启动的问题

ara*_*kn0 24 android media-player

我是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()不必在"停止"按钮中调用该方法.有帮助吗?

提前致谢!!!

ads*_*tro 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);
    }
Run Code Online (Sandbox Code Playgroud)

mediaPlay是一个成员变量,可以在类中的其他位置创建和发布.这可能不是最好的方式(我自己是Android新手),但似乎有效.请注意,在播放mediaPlayer之前,代码可能会落到方法的底部.如果您需要播放一系列资源,您仍需要处理此案例.


mis*_*kin 15

这是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;
    }
Run Code Online (Sandbox Code Playgroud)


pet*_*scu 9

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

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

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

  • 这仅适用于Android 2.2及更高版本. (2认同)

小智 4

您可以使用

mp.pause();
mp.seekTo(0);
Run Code Online (Sandbox Code Playgroud)

停止音乐播放器。