Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通知声音未播放。拒绝许可_Android_Notifications - Fatal编程技术网

Android 通知声音未播放。拒绝许可

Android 通知声音未播放。拒绝许可,android,notifications,Android,Notifications,自定义通知声音不工作。来自内部存储的声音,文件所有者不是我的应用程序 代码: 错误: java.lang.SecurityException: Permission Denial: reading com.android.fileexplorer.provider.FileExplorerFileProvider uri content://com.android.fileexplorer.myprovider/external_files/zedge/notification_sound/Ma

自定义通知声音不工作。来自内部存储的声音,文件所有者不是我的应用程序

代码:

错误:

java.lang.SecurityException: Permission Denial: reading com.android.fileexplorer.provider.FileExplorerFileProvider uri content://com.android.fileexplorer.myprovider/external_files/zedge/notification_sound/Marbles.mp3 from pid=1874, uid=1000 requires the provider be exported, or grantUriPermission()
        at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:616)
        at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:483)
        at android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:474)
        at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:419)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:313)
        at android.os.Binder.execTransact(Binder.java:569)
2018-11-11 16:08:20.613 756-15193/? E/MediaPlayerService: Couldn't open fd for content://com.android.fileexplorer.myprovider/external_files/zedge/notification_sound/Marbles.mp3
2018-11-11 16:08:20.613 1874-23378/? E/MediaPlayer: Unable to create media player
明斯克版本21

如何修复它

UPD:

我在“urisound=Uri.parse(account.notifySound);”之后添加了:

并得到一个错误:

 java.lang.SecurityException: Uid 10204 does not have permission to uri 0 @ content://com.android.fileexplorer.myprovider/external_files/zedge/notification_sound/Marbles.mp3
UPD2:

铃声选择器打开了多个声音浏览器,如“音乐”,“主题”,再次“音乐”-另一个声音浏览器,不同的第一个“音乐”

当我在“音乐”中选择声音时,选择soundUri=:

content://com.android.fileexplorer.myprovider/external_files/zedge/notification_sound/Snapchat_Tone-04a0409e-68c4-4294-beb3-bb137b8d5886.mp3

在“主题”中选择声音时:

file:///storage/emulated/0/MIUI/.ringtone/Snapchat_Tone-04a0409e-68c4-4294-beb3-bb137b8d5886.mp3

此声音在Uri以“文件://”(声音资源管理器“主题”)开头时播放,在Uri以“内容://”(声音资源管理器“音乐”)开头时出错

虽然在“音乐”中选择时会播放一些其他文件,但Uri开头为“content://...“

正如编译器所说:

要求导出提供程序或grantUriPermission()

你可以试试这个:

grantUriPermission("com.android.systemui", sound,
    Intent.FLAG_GRANT_READ_URI_PERMISSION);
其中
sound
是与setSound()一起使用的
Uri

如果您不能确定哪些程序包应授予权限,则下面的帮助程序函数将循环搜索:

public static void grantUriPermission(Activity ctx, Intent intent, Uri uri, int permissionFlags) {
    List<ResolveInfo> resolvedIntentActivities = ctx.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);

    for (ResolveInfo resolvedIntentInfo : resolvedIntentActivities) {
        String packageName = resolvedIntentInfo.activityInfo.packageName;

        ctx.grantUriPermission(packageName, uri, permissionFlags);
    }
}
publicstaticvoidgranturipermission(活动ctx、意图Intent、Uri、int-permissionFlags){
List resolvedIntentActivities=ctx.getPackageManager().queryIntentActivities(仅限intent、PackageManager.MATCH_DEFAULT_);
对于(ResolveInfo resolvedIntentInfo:resolvedIntentActivities){
字符串packageName=resolvedIntentInfo.activityInfo.packageName;
ctx.grantUriPermission(packageName、uri、permissionFlags);
}
}

我添加了grantUriPermission,但出现了错误。我更新了我的问题
grantUriPermission("com.android.systemui", sound,
    Intent.FLAG_GRANT_READ_URI_PERMISSION);
public static void grantUriPermission(Activity ctx, Intent intent, Uri uri, int permissionFlags) {
    List<ResolveInfo> resolvedIntentActivities = ctx.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);

    for (ResolveInfo resolvedIntentInfo : resolvedIntentActivities) {
        String packageName = resolvedIntentInfo.activityInfo.packageName;

        ctx.grantUriPermission(packageName, uri, permissionFlags);
    }
}