我有通知声音的URI,如content://media/internal/audio/media/122
,但SoundPool
不适用于URI,它只适用于文件路径的apk资源。
有没有办法从URI获取媒体文件路径?我尝试了Uri.getPath()
,它返回/internal/audio/media/122
,但这不是有效的文件路径,当然SoundPool
不适用于此类补丁。
实际上通知的真实路径是/system/media/audio/notifications/allegro.ogg
,我认为无法从content://media/internal/audio/media/122
或者我应该使用MediaPlayer
吗?我测试过,它有效:
MediaPlayer mp = MediaPlayer.create(this, "content://media/internal/audio/media/122");
mp.start();
我很困惑因为MediaPlayer
似乎太沉重而不能播放简短的通知声音,所以我更愿意使用SoundPool
。
请告诉我MediaPlayer
重量是否错误,并建议通过其URI播放通知声音的正确方法。
答案 0 :(得分:20)
好吧,我通过URI获得了播放音频的最简单方法:
RingtoneManager.getRingtone(this, Uri.parse("content://media/internal/audio/media/122")).play();
我认为这是我能做到的最好的事情。
答案 1 :(得分: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更快更轻。
答案 2 :(得分:0)
受到德米特里答案的启发。
只需一行即可解决问题。
RingtoneManager.getRingtone(this, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)).play();