【问题标题】:Problems with MediaPlayer, raw resources, stop and startMediaPlayer、原始资源、停止和启动问题
【发布时间】:2010-06-03 19:47:32
【问题描述】:

我是 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() 不必在“停止”按钮中调用。有什么帮助吗?

提前致谢!!!

【问题讨论】:

  • 您要暂停 Mediaplayer 还是完全停止并重新播放?
  • 完全停止并再次播放。要暂停...如果要继续播放,您必须调用方法 pause() 然后 start()。这很容易并且有效。问题是当您尝试完全停止并再次播放时(就像在任何音乐播放器中一样)
  • 我有同样的“问题”。我目前所做的是每次开始歌曲时创建一个新的 MediaPlayer。我知道它用资源填充内存,但我也在以前使用的 MediaPlayer 上调用 mp.release()。我认为这解决了内存问题。我没有看到任何其他解决方案。
  • 遇到了同样的问题,请问您解决了吗?

标签: android media-player


【解决方案1】:

这是我使用单个 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 完成播放之前,代码可能会落到方法的底部。如果需要播放一系列资源,还是需要处理这种情况的。

【讨论】:

  • AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);效果很好,但似乎并非在所有手机上。我刚刚收到用户的错误报告 - 太糟糕了,它确实说明了那是什么手机
【解决方案2】:

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;
    }

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 这仅适用于 android 2.2 及更高版本。
    【解决方案4】:

    你可以使用

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

    停止音乐播放器。

    【讨论】:

      【解决方案5】:

      最后,它适用于我的方式:

      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;
                      }
                  }
              });
          }
      }
      

      【讨论】:

        【解决方案6】:

        先生。矩形,这条消息可能为时已晚,但我自豪地将这些代码写成你的想法:我有 mp 代表 mediaplayersescal9button

        ....
        if(btnClicked.getId() == sescal9_ornek_muzik.getId())
                {
                    mp.start();
                    mp.seekTo(380);
                    mp2.start();
                    mp2.seekTo(360);
                    mp3.start();
                    mp3.seekTo(340);
                    ...
                    }
        

        【讨论】:

          【解决方案7】:

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

          可能的原因

          1. 上下文可能为空
          2. 您的媒体文件可能已损坏

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多