我在app文件夹中有一个mp3文件。我可以通过getFilesDir().getAbsolutePath()
访问它,但我没有成功使用声音来播放通知。
我的目标是允许用户下载自定义音,我不想覆盖默认的应用声音,因此铃声存储在上述文件目录中。
如何获取文件的正确路径作为通知声音?
答案 0 :(得分:1)
您需要使用FileProvider
将文件URI传递给通知。 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)
。还有其他可能的基本路径。有关完整列表,请查看有关如何define the provider available files。
的文档 Obs。:正如您在评论中所述,您要播放的音频文件不应包含特殊字符,下划线或任何其他受限字符。像命名/res
资源文件一样命名文件。