以下是我刚刚发表的博客文章,此处转载是因为,为什么呢?
您可以
Notification通过on之类的方法
setSound()在上添加自定义铃声
NotificationCompat.Builder。
Uri正如Stack
Overflow上
的一些人所报道的那样,这需要一个,并在Android
7.0上引起问题 。
如果您使用
file:
Uri的价值观,他们不再在Android
7.0的工作,如果你
targetSdkVersion是24或更高,因为声音
Uri是检查是否符合在禁令
file:
Uri值。
但是,如果您尝试使用
content:
Urifrom等功能
FileProvider,则您的声音将无法播放…,因为Android没有对该内容的读取权限。
以下是解决此问题的一些选项。
手术刀:grantUriPermissions()
您始终可以通过上
grantUriPermissions()的方法向其他应用授予内容权限
Context。挑战在于知道要向 谁 授予权限。
在Nexus 6P(Android 6.0 …仍…)和Nexus 9(Android 7.0)上可以使用的功能是:
grantUriPermission("com.android.systemui", sound, Intent.FLAG_GRANT_READ_URI_PERMISSION);(这里
sound是
Uri你使用的是带有
setSound())
我不能说这是否适用于所有设备和所有Android OS版本。
断头台:没有更多的用户文件
android.resource作为一种方案,对于的
Uri值可以很好地工作
setSound()。与其允许用户从文件中选择自己的铃声,不如让他们选择您作为应用程序中的原始资源提供的几种铃声之一。但是,如果这表示丧失了应用程序功能,则您的用户可能会不满意。
轴:使用自定义ContentProvider
FileProvider导出时无法使用-启动时崩溃。但是,在这种情况下,唯一
content:
Uri不会出现其他问题的方法就是提供者所在的位置
exported,并且没有读取访问权限(或者恰好需要某种权限,
com.android.systemui或者恰好持有该权限
)。
最后,我会为这个选项添加到 我的
StreamProvider,因为一些“只读”提供功能的一部分。
但是,您可以为此选择自己的提供商。
电锯:禁止禁令
以下代码段阻止了所有
StrictMode与VM行为有关的检查(即,除主应用程序线程行为外的其他检查),包括对
file:
Uri值的禁止:
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().build());
另外,您可以使用自己
VmPolicy想要的任何规则来配置自己,而无需调用
detectFileUriExposure()。
这使您可以
file:
Uri在任何地方使用值。Google禁止使用的理由很充分
file:
Uri,因此从长远来看,尝试避免使用该禁止措施可能会咬伤不幸的身体部位。
核弹:低一点targetSdkVersion
这也消除了对
file:
Uri价值的禁止,以及
targetSdkVersion24岁以上的孩子选择参加的所有其他行为。值得注意的是,
Toast
如果用户进入分屏多窗口模式,这将导致您的应用显示“可能无法使用分屏” 。
真正的解决方案:Android中的修复程序
本
NotificationManager应呼吁
grantUriPermissions()对我们来说,还是应该给我们一些其他的方式,以联想
FLAG_GRANT_READ_URI_PERMISSION与
Uri我们使用自定义
Notification声音。
敬请期待进一步的发展。



