Android 7.0(API 24)以上调用系统安装包问题
Android 7.0之后对于文件访问安全性加强,一些旧的调用方法也发生了结果异常。
Android 7.0(API 24)以前可用的安装方法
public static boolean installApk(Context context, String apkPath) {File apkFile = new File(apkPath);if(!apkFile.exists() || !apkFile.isFile()) return false;Intent installIntent = new Intent(Intent.ACTION_VIEW);installIntent.setDataAndType(Uri.parse("file://" + apkFile.toString()), "application/vnd.android.package-archive");installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(installIntent);// GNavigationBar.show(context); ///< show navigation bar
// android.os.Process.killProcess(android.os.Process.myPid());return true;}
会出现如下异常:
android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.xx.xxx/cache/imrider.apk exposed beyond app through Intent.getData()
Android 7.0(API 24)以后可用的安装方法
使用自定义provider方式解决:
public static void installMyApk(Context context, String path) {Intent intent = new Intent(Intent.ACTION_VIEW);//判断是否是AndroidN以及更高的版本if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);Uri contentUri = FileProvider.getUriForFile(context,BuildConfig.APPLICATION_ID + ".fileProvider",new File(path));intent.setDataAndType(contentUri, "application/vnd.android.package-archive");} else {intent.setDataAndType(Uri.fromFile(new File(path)),"application/vnd.android.package-archive");intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}context.startActivity(intent);}
AndroidManifest.xml中的配置:
<!--Android 7.0(api 24)以上使用file://访问文件需要用FileProvider方式--><!--file_paths为配置的可访问路径--><providerandroid:name="androidx.core.content.FileProvider"android:authorities="com.xx.xxx.fileProvider"android:grantUriPermissions="true"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider>
资源文件中新建file_paths.xml,用于存放可以访问的文件路径定义等:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!-- <external-path path="Android/data/app的包名/" name="files_root" />--><external-path path="." name="external_storage_root" />
</paths>
https://blog.csdn.net/xdy1120/article/details/99180956 中说要配置一下权限:
<!--安卓8.0打开apk安装更新-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
应该是配合他自己的代码使用的:
private void openFile(final Context context) {//判读版本是否在8.0以上if (Build.VERSION.SDK_INT >= 26) {//来判断应用是否有权限安装apkboolean installAllowed= context.getPackageManager().canRequestPackageInstalls();if(installAllowed){installApk(context);}else {installApk(context);new Handler(Looper.getMainLooper()).post(new Runnable() {@Overridepublic void run() {ToastUtil.ToastShort(context,"请设置开启允许安装未知应用");//此处只做提示,系统会自动弹框提醒,并可跳转开启
// Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:" + context.getPackageName()));
// context.startActivity(intent);}});}} else {installApk(context);}}
注:上述部分不写应该也是没有关系的。
Android碎片化严重,系统变更有时候会带来很多意外结果。
参考链接
- Android android.uid.system的应用调用安装apk失败
- android 8.0系统调用安装APK
Android 7.0(API 24)以上调用系统安装包问题相关推荐
- android版本兼容API24,Android 7.0 (API 24) 适配
Android 7.0 (API 24) 适配 电池和内存 低电耗模式 此项新增的行为不会影响有关使您的应用适应Android 6.0(API级别23)中所推出的旧版本低电耗模式的建议和最佳做法,如对 ...
- Android开发者福利之--------Android 6.0 API
Android 6.0 API 着手开发 要着手开发 Android 6.0 应用,您必须先获得 Android SDK,然后使用 SDK 管理器下载 Android 6.0 SDK Platform ...
- Android 5.0 API 的变化——开发人员注意
Android 5.0 API变化 译自 http://developer.android.com/intl/zh-cn/about/versions/android-5.0.html -- By N ...
- 关于fi dd ler 手机抓包 网卡地址地址_[问题]Android 7.0+使用VirtualXposed+Charles进行抓包
Android 7.0+使用VirtualXposed+Charles进行抓包(下面以android10为例) 来源: Android 7.0+使用VirtualXposed+Charles进行抓包 ...
- Android 6.0 API
Android 6.0 (M) 为用户和应用开发者提供了新功能.本文旨在介绍其中最值得关注的 API. 着手开发 要着手开发 Android 6.0 应用,您必须先获得 Android SDK,然后使 ...
- 天地图,js 4.0 api,简单调用,高手请绕行
本文介绍使用天地图 js4.0 api,实现地图显示后台gps分布情况: 主要借用H5 GPS获取,利用天地图的背景展示: 效果图如下: 第一步,通过采集网页,手机gps数据,录入后台数据库:界面如下 ...
- android 6.0 api 管理,Android 6.0(API23)权限申请问题
1.在API23+以上,不止要在AndroidManifest.xml里面添加权限 2.还要在JAVA代码中请求权限: // Storage Permissions private static fi ...
- os+rom+android+6.0+n9005,三星N9005刷机包 Aurora.Note3.Full.Note5.Port.No.8 重新调试系统底层 提升系统流畅度...
三星N9005刷机包 Aurora.Note3.Full.Note5.Port.No.8 重新调试系统底层 提升系统流畅度,更多优化请刷入体验. 三星N9005刷机包No.8更新内容: 1.基于S5较 ...
- Android 版本对于 API
Android版本 API 代号 官网链接 Android 2.3.3 API 10 Gingerbread 官网 Android 3.0 API 11 Android 3.1 API 12 Andr ...
- Android 6.0 新特性和功能,系统和 API 行为更新
Android 6.0 API 更新(Android M.API Level 23) 指纹身份验证 此版本提供了一些新的 API,在受支持的设备上,用户只需扫描其指纹即可完成身份验证,这些 API 还 ...
最新文章
- asp.net mvc下的多语言方案 包含Html,Javascript和图片
- [HTML代码]会移动的文字(Marquee)
- 抗原试剂盒也卷起来了,我的塑料袋不会影响房价吧?
- i春秋30强挑战赛pwn解题过程
- P2272-[ZJOI2007]最大半连通子图【tarjan,缩点】
- python中对字符串进行编码_Python 中的字符串编码
- 环洋市场分析-2021年全球MICC电缆行业调研及趋势分析报告
- (CPU)关于x86、x86_64/x64、amd64和arm64/aarch64
- Linux偷偷“吃”了我的内存?
- 2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!(转载)
- 预测模型如何改进自动化决策
- iOS Quartz2D 渐变图形 CGGradient CGShading
- DLL注入的8种姿势
- 【dubbo】(一) dubbo是什么?
- Java将数据信息写入文件文件的几种实现方法
- 在ROS下控制dobot(magician)机械手的滑轨
- Python—numpy模块下函数介绍(一)numpy.ones、empty等
- python报错 ‘utf-8‘ codec can‘t encode characters in position xxxx-xxxx: surrogates not allowed
- Neo4j笔记(二)Cypher(6)UNWIND和FOREACH
- [原创]微软BI专题-渐变维度Type2进化三部曲
热门文章
- 15_实现浏览器记录
- Android native memory leak detect (Android native内存泄露检测)
- 太原理工计算机组成原理报告,太原理工计算机组成原理考试题.pdf
- python操作adb详解_Python之使用adb shell命令启动应用的方法详解
- HDU2147 kiki's game
- BZOJ1076[SCOI2008] 奖励关
- C++STL优先队列使用
- lvcreate 创建逻辑卷
- Linux下安装zabbix详细介绍
- java程序员选择多个offer时需要看重哪些?_27 道阿里巴巴 Java 面试题,你会几道?...