【问题标题】:Set Notification Sound from Assets folder从 Assets 文件夹设置通知声音
【发布时间】:2012-02-06 17:42:10
【问题描述】:

我正在附加资产文件夹中的声音文件以在通知中播放声音,但我无法播放资产文件夹中的声音。

我有设置页面,用户可以从中设置通知的声音,也可以播放声音。这部分已经完成。我可以使用媒体播放器从资产文件夹播放声音。我可以在创建通知时使用相同的逻辑,但是当用户单击通知时可能会发生问题,因为媒体播放器仍在播放声音。

我试过了

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

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

【问题讨论】:

    标签: android notifications media-player android-resources android-assets


    【解决方案1】:

    把你的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");
    

    【讨论】:

    • 是的,创建内容提供程序来访问内部文件是个好主意
    • 注意,我发现声音必须是 .mp3 才能工作,而不是 .ogg(就像我们的其他声音一样)。而且,正如上面 rajpara 所示,似乎也有必要不包括扩展名。所以我的声音文件,myproject/res/raw 文件夹中的 push.mp3 使用:android.resource://com.mycompany.myapp/raw/push
    • @rajpara 请告诉我如何编写代码将此 Uri 设置为铃声、通知和闹钟。我没有找到相关的内容。
    • 第一种引用R.raw.myvideo 的方法将在资源ID 发生变化时停止工作,因为通知通道不允许您更改声音/路径。看到这个帖子:stackoverflow.com/a/54796493/5301868
    • 怎么强调都不为过:如果您使用此方案来生成与NotificationChannel 一起使用的合理 URI,请注意资源 ID 在构建之间可能会发生变化。而且,由于您无法编辑与给定 NotificationChannel 关联的 URI(一旦建立),这将导致您的应用程序的通知声音在更新后随机中断。请改用this pattern;避免使用整数资源 ID。
    【解决方案2】:

    这对我来说非常有效。我在另一个帖子上找到了。

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

    【讨论】:

    • 您的 Uri 表明您正在访问资源文件夹而不是资产。您正在引用资源中行文件夹中的文件。
    • 确实很好,我们将声音文件放入行文件夹并引用该文件。
    【解决方案3】:

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

    【讨论】:

    • 是的,我认为你是对的。要访问私有资源,我将不得不使用内容提供者。
    • 问题与铃声无关。
    【解决方案4】:

    从资产文件夹加载内容的正确路径是file:///android_assets/relative_path_to_your_file。请注意此处的三个斜杠。虽然我没有尝试以这种方式设置通知声音,但我已经多次成功地将它与 WebView 一起使用,并且希望它能够以相同的方式工作。

    【讨论】:

    • 好吧,让我试试三个斜线
    【解决方案5】:

    我无法直接访问通知的资产音频文件。 所以我按照这个步骤,所以我可以在通知中播放音频

    1. 我将该文件复制到数据目录。
    2. 通知声音无法访问静态数据目录,因此我创建了一个自定义 Content Provider 以共享现在位于数据文件夹中的 read more 中的音频文件。
    3. 现在,在创建通知时,我已将文件的 Uri 设置为通知声音。

    现在使用这些步骤,我可以为通知设置自定义声音。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      • 我如何从这个 AssetFileDescriptor 获取铃声?
      • @wutzebaer 你可以给 NotificationCompat.Builder 一个声音的 URI 来播放通知。您的内容提供程序中的 openAssetFile 被赋予此 URI,并将 AssetFileDescriptor 返回到播放通知developer.android.com/reference/android/support/v4/app/…
      猜你喜欢
      • 1970-01-01
      • 2011-07-05
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多