从Assets文件夹设置通知声音

时间:2012-01-10 09:40:02

标签: android notifications media-player android-resources android-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

还是其他任何想法?请给我提示。

6 个答案:

答案 0 :(得分:34)

将您的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");

答案 1 :(得分:8)

这对我来说非常合适。我在另一篇文章中找到了它。

notification.sound = Uri.parse("android.resource://my.package.name/raw/notification");

答案 2 :(得分:5)

资产是该应用的私有资源,我认为您无法将其设置为铃声,您需要一个公共文件,媒体进程可以访问该公共文件来设置铃声。您必须将文件复制到SD卡以将其设置为铃声。

答案 3 :(得分:0)

从资源文件夹加载内容的正确路径为file:///android_assets/relative_path_to_your_file。请注意三斜杠。虽然我没有尝试以这种方式设置通知声音,但我已经多次使用它与WebView成功,并期望它以相同的方式工作。

答案 4 :(得分:0)

我无法直接访问资产音频文件到通知。 所以我按照这个步骤进行操作,因此我可以在通知中播放音频

  1. 我将这些文件复制到数据目录。
  2. Notification声音无法访问静态数据目录,因此我创建了一个自定义Content Provider来共享读取更多的音频文件,这些文件现在位于数据文件夹中。
  3. 现在,在创建通知时,我已将文件的Uri设置为通知声音。
  4. 现在使用此步骤,我可以将自定义声音设置为通知。

答案 5 :(得分:0)

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