我正在将声音文件附加到assets文件夹中,以便在通知中播放声音,但我无法从assets文件夹播放声音。
我有设置页面,用户可以设置通知的声音,也可以播放声音。此部分已完成。我可以使用Media Player播放资产文件夹中的声音。我可以在创建通知时使用相同的逻辑,但当用户点击通知时可能会出现问题,因为媒体播放器仍在播放声音。
我试过
notification.sound = Uri.parse("file:///android_asset/Sound/Long/AlarmClock.mp3");
也尝试过这种
notification.sound = Uri.parse("android_asset/Sound/Long/AlarmClock.mp3");
但我的问题仍未解决。
有没有其他方法可以在资产目录的通知中设置声音?
Logcat
01-10 09:57:01.509: ERROR/PlayerDriver(31): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported
01-10 09:57:01.509: ERROR/MediaPlayer(52): error (1, -4)
01-10 09:57:01.519: WARN/NotificationService(52): error loading sound for android_asset/Sound/Long/audio.mp3
01-10 09:57:01.519: WARN/NotificationService(52): java.io.IOException: Prepare failed.: status=0x1
01-10 09:57:01.519: WARN/NotificationService(52): at android.media.MediaPlayer.prepare(Native Method)
01-10 09:57:01.519: WARN/NotificationService(52): at android.media.AsyncPlayer.startSound(AsyncPlayer.java:64)
01-10 09:57:01.519: WARN/NotificationService(52): at android.media.AsyncPlayer.access$200(AsyncPlayer.java:33)
01-10 09:57:01.519: WARN/NotificationService(52): at android.media.AsyncPlayer$Thread.run(AsyncPlayer.java:99)
01-10 09:57:01.519: WARN/PlayerDriver(31): PVMFInfoErrorHandlingComplete
或者其他想法?请给我提示。
将您的mp3文件放入res->raw folder
,尝试从raw folder
获取声音文件。
Uri path = Uri.parse("android.resource://com.androidbook.samplevideo/" + R.raw.myvideo);
或
Uri path = Uri.parse("android.resource://com.androidbook.samplevideo/raw/myvideo");
这对我来说非常有效。我在另一篇帖子中找到了它。
notification.sound = Uri.parse("android.resource://my.package.name/raw/notification");
资产是该应用程序的私人资源,我认为您无法将它们设置为铃声,您需要一个媒体进程可以访问的公共文件来设置铃声。您必须将文件复制到SD卡才能将其设置为铃声。
从资产文件夹加载内容的正确路径是file:///android_assets/relative_path_to_your_file
。请注意此处的三个斜杠。虽然我没有尝试过以这种方式设置通知声音,但我已经在WebView中成功地使用了多次,并且希望它也能以同样的方式工作。
我无法直接访问通知的资产音频文件。所以我遵循这些步骤,这样我就可以在通知中播放音频
- 我把那些文件复制到数据目录
- Notification声音无法访问静态数据目录,因此我创建了一个自定义
Content Provider
来共享read more中的音频文件,这些文件现在位于数据文件夹中 - 现在,在创建通知时,我已经将文件的Uri设置为notification声音
现在使用这些步骤,我可以将自定义声音设置为通知。
ContentProvider是一条不错的选择。我认为没有必要像@Dharmendra建议的那样将文件复制到数据目录中。您可以通过ContentProvider 直接访问资产文件夹
public AssetFileDescriptor openAssetFile(Uri uri, String mode)
throws FileNotFoundException {
String filePart = Sound.getSoundFileName(uri);
try {
return getContext().getResources().getAssets().openFd(filePart + ".ogg");
}catch(IOException e) {
Log.d(TAG, "fail " + e.getMessage());
}
return null;
}