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)以上调用系统安装包问题相关推荐

  1. android版本兼容API24,Android 7.0 (API 24) 适配

    Android 7.0 (API 24) 适配 电池和内存 低电耗模式 此项新增的行为不会影响有关使您的应用适应Android 6.0(API级别23)中所推出的旧版本低电耗模式的建议和最佳做法,如对 ...

  2. Android开发者福利之--------Android 6.0 API

    Android 6.0 API 着手开发 要着手开发 Android 6.0 应用,您必须先获得 Android SDK,然后使用 SDK 管理器下载 Android 6.0 SDK Platform ...

  3. Android 5.0 API 的变化——开发人员注意

    Android 5.0 API变化 译自 http://developer.android.com/intl/zh-cn/about/versions/android-5.0.html -- By N ...

  4. 关于fi dd ler 手机抓包 网卡地址地址_[问题]Android 7.0+使用VirtualXposed+Charles进行抓包

    Android 7.0+使用VirtualXposed+Charles进行抓包(下面以android10为例) 来源: Android 7.0+使用VirtualXposed+Charles进行抓包​ ...

  5. Android 6.0 API

    Android 6.0 (M) 为用户和应用开发者提供了新功能.本文旨在介绍其中最值得关注的 API. 着手开发 要着手开发 Android 6.0 应用,您必须先获得 Android SDK,然后使 ...

  6. 天地图,js 4.0 api,简单调用,高手请绕行

    本文介绍使用天地图 js4.0 api,实现地图显示后台gps分布情况: 主要借用H5 GPS获取,利用天地图的背景展示: 效果图如下: 第一步,通过采集网页,手机gps数据,录入后台数据库:界面如下 ...

  7. android 6.0 api 管理,Android 6.0(API23)权限申请问题

    1.在API23+以上,不止要在AndroidManifest.xml里面添加权限 2.还要在JAVA代码中请求权限: // Storage Permissions private static fi ...

  8. 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较 ...

  9. Android 版本对于 API

    Android版本 API 代号 官网链接 Android 2.3.3 API 10 Gingerbread 官网 Android 3.0 API 11 Android 3.1 API 12 Andr ...

  10. Android 6.0 新特性和功能,系统和 API 行为更新

    Android 6.0 API 更新(Android M.API Level 23) 指纹身份验证 此版本提供了一些新的 API,在受支持的设备上,用户只需扫描其指纹即可完成身份验证,这些 API 还 ...

最新文章

  1. asp.net mvc下的多语言方案 包含Html,Javascript和图片
  2. [HTML代码]会移动的文字(Marquee)
  3. 抗原试剂盒也卷起来了,我的塑料袋不会影响房价吧?
  4. i春秋30强挑战赛pwn解题过程
  5. P2272-[ZJOI2007]最大半连通子图【tarjan,缩点】
  6. python中对字符串进行编码_Python 中的字符串编码
  7. 环洋市场分析-2021年全球MICC电缆行业调研及趋势分析报告
  8. (CPU)关于x86、x86_64/x64、amd64和arm64/aarch64
  9. Linux偷偷“吃”了我的内存?
  10. 2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!(转载)
  11. 预测模型如何改进自动化决策
  12. iOS Quartz2D 渐变图形 CGGradient CGShading
  13. DLL注入的8种姿势
  14. 【dubbo】(一) dubbo是什么?
  15. Java将数据信息写入文件文件的几种实现方法
  16. 在ROS下控制dobot(magician)机械手的滑轨
  17. Python—numpy模块下函数介绍(一)numpy.ones、empty等
  18. python报错 ‘utf-8‘ codec can‘t encode characters in position xxxx-xxxx: surrogates not allowed
  19. Neo4j笔记(二)Cypher(6)UNWIND和FOREACH
  20. [原创]微软BI专题-渐变维度Type2进化三部曲

热门文章

  1. 15_实现浏览器记录
  2. Android native memory leak detect (Android native内存泄露检测)
  3. 太原理工计算机组成原理报告,太原理工计算机组成原理考试题.pdf
  4. python操作adb详解_Python之使用adb shell命令启动应用的方法详解
  5. HDU2147 kiki's game
  6. BZOJ1076[SCOI2008] 奖励关
  7. C++STL优先队列使用
  8. lvcreate 创建逻辑卷
  9. Linux下安装zabbix详细介绍
  10. java程序员选择多个offer时需要看重哪些?_27 道阿里巴巴 Java 面试题,你会几道?...