|
备注:(该问题出现在大多数10.0设备,8.0、9.0设备测试正常)
- 第一次报错:android.content.ActivityNotFoundException:
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW type=application/vnd.android.package-archive flg=0x10000000 }
报错图片:

问题分析:
android框架使用StrictMode Api禁止我们的应用对外部(跨越应用分享)公开file://,若使用file://格式共享文件则会报FileUriExposedException异常,android 7.0应用间的文件共享需要使用content://类型的URI分享,并且需要为其提供临时的文件访问权限 (Intent.FLAG_GRANT_READ_URI_PERMISSION和Intent.FLAG_GRANT_WRITE_URI_PERMISSION),对此,官方给我们的建议是使用FileProvider类进行分享。
解决方案:
(1)添加file_path.xml配置文件

(2)在AndroidManifest.xml文件中添加FileProvider,并配置file_paths文件

(3)安卓7.0以上设备需要判断,使用FileProvider.getUriForFile获取文件路径

报错信息:
java.lang.SecurityException: Permission Denial: reading android.support.v4.content.FileProvider uri content://包名.fileProvider/external_storage_root/app-client.apk from pid=5613, uid=10054 requires the provider be exported, or grantUriPermission()

问题分析:
在安装时URI路径错误 或 安装时杀死了进程(我的原因是安装前杀死了应用进程导致),排查下具体原因修复即可。
参考文章:FileProvider被禁止访问报解析包错误
例如:Activity.finish();KillProcess();System.exit(0);
问题截图:

第三次报错:未知来源应用安装权限
由于 getPackageManager().canRequestPackageInstalls();只有在编译版本为8.0时才能使用,且必须是目标版本为8.0以上才能正确获取。
报错截图:

解决方案:
添加Android8.0 允许安装未知来源权限即可。
参考文章:
未知来源应用安装权限决绝方法
//兼容8.0
boolean installAllowed;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
installAllowed = context.getPackageManager().canRequestPackageInstalls();
if (installAllowed) {
installApk(file);
} else {
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:" + context.getPackageName()));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
installApk(file);
return;
}
} else {
installApk(file);
}
//安装apk,兼容7.0
protected void installApk(File file) {
if (!file.exists()) {
return;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
// setFlags需要放到addFlags 之前否则不生效
// 由于没有在Activity环境下启动Activity,设置下面的标签
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//版本在7.0以上是不能直接通过uri访问的
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//参数1 上下文, 参数2 Provider主机地址和清单文件中保持一致 参数3 共享的文件
Uri apkUri =
FileProvider.getUriForFile(context, "com.xxx.fileProvider", file);
//添加这一句表示对目标应用临时授权该Uri所代表的文件
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive");
}
// intent.setDataAndType(Uri.parse("file://" + file.toString()), "application/vnd.android.package-archive");
context.startActivity(intent);
}
修复三个问题后,apk安装问题全部修复,可以正常安装使用。
ps:本文内容为个人遇到的问题修复经历,文笔水平有限,如有遗漏或错误请及时提出~ |