我在应用程序文件夹中有一个mp3文件。我可以通过getFilesDir().getAbsolutePath()
访问它,但我没有成功用作要播放的通知声音。
我的目标是允许用户下载自定义音调,我不想覆盖默认的应用程序声音,因此铃声存储在上述文件目录中。
如何获取要用作通知声音的文件的正确路径?
您需要使用FileProvider
将文件 URI 传递给通知。 例如:
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
,您必须声明哪些文件可用。如文档中所述:
提供程序只能为以下文件生成内容 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
资源文件一样命名文件。