5

我有通知声音的 URI,例如content://media/internal/audio/media/122,但SoundPool不适用于 URI,它仅适用于文件路径的 apk 资源。

有没有办法从 URI 获取媒体文件路径?我试过Uri.getPath(),它返回/internal/audio/media/122,但这不是有效的文件路径,当然SoundPool不适用于这样的补丁。

实际上通知的真正路径是/system/media/audio/notifications/allegro.ogg,我看不到从 URI 中获取它的方法,例如content://media/internal/audio/media/122

或者我应该为此使用MediaPlayer吗?我测试过,它有效:

           MediaPlayer mp = MediaPlayer.create(this, "content://media/internal/audio/media/122");
           mp.start();

我很困惑,因为MediaPlayer似乎太重而无法播放简短的通知声音,所以我更喜欢使用SoundPool.

如果我对MediaPlayer重量有误,请告诉我,并建议通过其 URI 播放通知声音的正确方法。

4

3 回答 3

22

好吧,我得到了通过 URI 播放音频的最简单方法:

RingtoneManager.getRingtone(this, Uri.parse("content://media/internal/audio/media/122")).play();

我认为这是我能做到的最好的。

于 2012-08-21T08:02:12.737 回答
0

试试这个以获得完整路径:

String path = Environment.getRootDirectory().getAbsolutePath(); //Will return "/system"
path = path + Uri.getPath().subString(9); //To cut "content:/" from the Uri path.
//Then pass this "path" to your SoundPool

你说的对。与用于音乐和视频的 MediaPlayer 不同,SoundPool 旨在用于通知等短应用音频资源。它比 MediaPlayer 更快更轻。

于 2012-08-21T07:00:48.770 回答
0

受到德米特里回答的启发。

一根线就能解决问题。

RingtoneManager.getRingtone(this, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)).play();
于 2018-08-31T12:30:20.177 回答