Android MediaPlayer:基于URI播放Raw中的音频资源

时间:2014-06-18 03:09:39

标签: android android-mediaplayer

我想解决的问题是需要播放音频文件的活动。大多数文件将由用户创建(并保存到外部存储器中),因此使用以下代码进行播放(基于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文件夹中的音频文件,因为我不一定知道需要哪些文件。我试过在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();

但没有任何反应。没有错误消息,没有播放音频。

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

3 个答案:

答案 0 :(得分:4)

我设法让它运转,这是我使用的代码。

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中的最佳答案)

答案 1 :(得分:1)

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

答案 2 :(得分:0)

当我在Uri中使用toString()时,它会失败,而当我直接使用Uri时,它会很好地播放。

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