笔记:requires the provider be exported, or grantUriPermission()

本文介绍了在Android应用中从Notification启动安装与直接在Activity中启动安装的区别,详细解析了因未正确设置文件提供权限导致的安装失败问题,并给出了具体解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

之前更新是通过Notification中加入PendingIntent,正常运行,现在改为下载apk后在当前Activity中启动安装。

代码:

原先使用Notification的代码如下

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    uri = FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID + ".provider", saveFilePath);
} else {
    uri = Uri.fromFile(saveFilePath);
}
intent.setDataAndType(uri, "application/vnd.android.package-archive");
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
Notification notification = new Notification.Builder(mContext).setAutoCancel(true).setOngoing(true).setContentTitle(mContext.getString(R.string.downloadSuccess)).setContentIntent(pendingIntent).setSmallIcon(R.mipmap.appicon).setWhen(System.currentTimeMillis()).setTicker(mContext.getString(R.string.downloadSuccess)).build();                            
mNotificationManager.notify(R.mipmap.appicon, notification);

修改之后的代码如下(和上面代码不在同一个类中)

Intent intent= new Intent(Intent.ACTION_VIEW);       
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    uri = FileProvider.getUriForFile(mBaseContext,BuildConfig.APPLICATION_ID + ".provider", apkPath);        
    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
    uri = Uri.fromFile(apkPath);
}
intent.setDataAndType(uri, "application/vnd.android.package-archive");
android.os.Process.killProcess(android.os.Process.myPid());

报错:

java.lang.SecurityException: Permission Denial
requires the provider be exported, or grantUriPermission()

原因:

没有获取到FLAG_GRANT_READ_URI_PERMISSION权限,需要调用grantUriPermission()方法获取,参考How to use support FileProvider for sharing content to other apps?

改正后的代码:

...
uri = FileProvider.getUriForFile(mBaseContext,BuildConfig.APPLICATION_ID + ".provider", apkPath);
grantUriPermission(getPackageName(),uri,Intent.FLAG_GRANT_READ_URI_PERMISSION);                    
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);                       
...
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值