我有通知声音的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
这样的URI中获得它
或者我应该使用MediaPlayer
吗?我测试过,它有效:
MediaPlayer mp = MediaPlayer.create(this, "content://media/internal/audio/media/122");
mp.start();
我很困惑,因为MediaPlayer
似乎太重了,不能只播放简短的通知声音,所以我更喜欢使用SoundPool
。
如果我对MediaPlayer
的权重有错,请告诉我,并建议通过其URI播放通知声音的正确方式。
好吧,我找到了通过URI播放音频的最简单方法:
RingtoneManager.getRingtone(this, Uri.parse("content://media/internal/audio/media/122")).play();
我认为这是我能取得的最好成绩。
尝试此操作以获得完整路径:
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更快、更轻。
受到德米特里回答的启发。
一行就可以解决问题。🙂
RingtoneManager.getRingtone(this, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)).play();