Как установить звук уведомления для файла, который находится в личной папке приложения? - PullRequest
0 голосов
/ 08 мая 2018

У меня есть mp3-файл внутри папки приложения. Я могу получить к нему доступ через getFilesDir().getAbsolutePath(), но мне не удается использовать его в качестве звука, воспроизводимого для уведомления.

Моя цель - разрешить пользователю загружать пользовательские мелодии, а я не хочу перезаписывать звуки приложения по умолчанию, поэтому рингтоны хранятся в указанном каталоге файлов.

Как узнать правильный путь для файла, который будет использоваться в качестве звука уведомления?

1 Ответ

0 голосов
/ 08 мая 2018

Вам необходимо передать URI файла в ваше уведомление, используя FileProvider. e.g.:

val file = File(fileAbsolutePath)
FileProvider.getUriForFile(context, authority, file)

Также вам нужно будет указать провайдера на вашем AndroidManifest.xml, как показано в примере ниже:

<provider
   android:name="android.support.v4.content.FileProvider"
   android:authorities="your authority here"
   android:exported="false"
   android:grantUriPermissions="true">

    <meta-data
       android:name="android.support.FILE_PROVIDER_PATHS"
       android:resource="@xml/file_paths"/>

</provider>

Что касается file_paths, вам нужно будет указать, какие файлы будут доступны. Как указано в документации:

FileProvider может генерировать URI контента только для файлов в каталоги, которые вы указали заранее. Чтобы указать каталог, указать его область хранения и путь в XML, используя дочерние элементы элемент.

Например:

<files-path name="my_audios" path="audios/" />

Имя тега будет определять базовую папку, из которой вы читаете файлы.

  • <files-path ... /> отобразится на files/, что является тем же путем, который вы получаете от Context.getFilesDir().
  • <cache-path ... /> приведет к подкаталогу кеша вашего приложения, который является тем же путем, что и getCacheDir().
  • <external-path ... /> указывает на корень вашего внешнего носителя. То же, что Environment.getExternalStorageDirectory().
  • <external-files-path ... /> ведет к корню внешней области хранения вашего приложения. Тот же путь, что и Context#getExternalFilesDir(String).

Есть и другие возможные базовые пути. Полный список можно найти в документации о том, как определить доступные для провайдера файлы .

Obs.: Как вы указали в своем комментарии, аудиофайлы, которые вы хотите воспроизвести, не должны иметь специальных символов, подчеркиваний или любых других запрещенных символов. Назовите файл так же, как для файлов ресурсов /res.

...