【问题标题】:Android MediaPlayer: Play Audio Resource in Raw Based on URIAndroid MediaPlayer:基于 URI 以 Raw 格式播放音频资源
【发布时间】:2014-06-18 03:09:39
【问题描述】:

我要解决的问题是需要播放音频文件的活动。大多数文件将由用户创建(并保存到外部存储中),因此使用以下代码(基于 Google 的示例代码)进行播放:

MediaPlayer mPlayer = new MediaPlayer();
mPlayer.setDataSource(filename);
mPlayer.prepare();
mPlayer.start();

不过,一些音频文件将包含在应用程序中,通常使用以下代码播放:

MediaPlayer mPlayer = MediaPlayer.create(getBaseContext(), R.raw.filename);
mPlayer.prepare();
mPlayer.start();

问题是我希望能够像播放用户创建的文件一样播放原始文件夹中的音频文件,因为我不一定知道需要哪个。我尝试在 raw 文件夹中获取音频文件的 URI 并使用以下代码播放:

Uri uri = Uri.parse("android/resource://com.my.package/" + R.raw.filename);
MediaPlayer mPlayer = new MediaPlayer();
mPlayer.setDataSource(uri.toString());
mPlayer.prepare();
mPlayer.start();

但是什么也没发生。没有错误消息,没有播放音频。

我概述了我认为最简单的解决方案,但如果它完成任务,我愿意走另一条路。非常感谢任何帮助。

【问题讨论】:

  • 我确定您现在已经可以使用它了,但是您应该使用“android.resource”,而不是“android/resource”。

标签: android android-mediaplayer


【解决方案1】:

我已经设法让它工作了,这是我使用的代码。

mMediaPlayer = new MediaPlayer();
Uri mediaPath = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.filename);
try {
    mMediaPlayer.setDataSource(getApplicationContext(), mediaPath);
    mMediaPlayer.prepare();
    mMediaPlayer.start();
} catch (Exception e) {
    e.printStackTrace();
}

我发现您的代码存在两个问题。首先是“android/resource”需要变成“android.resource”

第二个是 setDataSource(String) 在这种情况下不起作用,因为您需要上下文才能使用原始文件,否则它会尝试错误地打开文件。 (请参阅MediaPlayer.setDataSource(String) not working with local files 中的最佳答案)

【讨论】:

  • 谢谢...我花了 2 个愚蠢的小时尝试才找到您的答案,再加上 1 个。
【解决方案2】:
final int[] song = {R.raw.letmeloveyou,R.raw.aarti,R.raw.answer};
final MediaPlayer mp = new MediaPlayer();

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        try {
            if (true == mp.isPlaying()) {
                mp.stop();
                mp.reset();
                Toast.makeText(getBaseContext(), "Again Playing", Toast.LENGTH_LONG).show();
                mp.setDataSource(Result.this, Uri.parse("android.resource://" + getPackageName() + "/" + song[position]));
                mp.prepare();
                mp.start();
            } else {
                Toast.makeText(getBaseContext(), "Playing", Toast.LENGTH_LONG).show();
                mp.setDataSource(Result.this, Uri.parse("android.resource://" + getPackageName() + "/" + song[position]));
                mp.prepare();
                mp.start();
            }
        } catch (Exception e) {        
            Toast.makeText(getBaseContext(),e.toString(),Toast.LENGTH_LONG).show();
        }
    }
});

【讨论】:

    【解决方案3】:

    当我在Uri 中使用 toString() 时它失败了,当我直接使用Uri 时它运行良好。

    Uri musicUri = Uri.parse("android.resource://" + context.getPackageName() + "/" + resourceID);
    Log.d(TAG, "musicUri: " + musicUri);
    mediaPlayer.setDataSource(context, musicUri);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多