Android 版本更新安装apk

版本更新是每个安卓应用都会涉及的,当有新的版本更新下载后,调用系统安装程序安装新的apk,targetSdkVersion 在7.0以下时我们直接使用以下代码:

/*** 安装apk** @param context* @param path    本地apk路径*/public static void installApk(Context context, String path) {Intent install = new Intent(Intent.ACTION_VIEW);install.setDataAndType(Uri.fromFile(new File(path)),"application/vnd.android.package-archive");install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(install);}

但是当targetSdkVersion 适配7.0以后当手机时,由于谷歌权限政策的变动,直接使用上面的方法将会报FileUriExposeException异常,8.0时,有的手机会报解析软件包时出现问题,查看google文档可以看见:

所以按照google提示,我们需要使用FileProvider,授权访问对应文件。那需要怎么做兼容呢?其实也很简单,步骤如下:
1.定义一个FileProvider

<manifest>...<application>...<providerandroid:name="androidx.core.content.FileProvider"android:authorities="${applicationId}.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider>...</application>
</manifest>

2.指定可用目录文件
在工程的res目录下创建xml/file_paths.xml文件,并指定对应目录。

需要先说明下,paths中已经定义好代表各个常用目录的元素,

元素 目录
files-path getFilesDir()
cache-path getCacheDir()
external-path Environment.getExternalStorageDirectory()
external-files-path getExternalFilesDir(String) /getExternalFilesDir(null)
external-cache-path getExternalCacheDir()

所以比如我们要指定
Environment.getExternalStorageDirectory()+"/App/download/"目录,则代码如下

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><!--<files-path name="my_images" path="images/"/>--><!--Context.getFilesDir()--><!--<files-path name="name" path="path" />--><!--getCacheDir()--><!--<cache-path name="name" path="path" />--><!--Environment.getExternalStorageDirectory()--><!--<external-path name="name" path="path" />--><!--Context#getExternalFilesDir(String) Context.getExternalFilesDir(null)--><!--<external-files-path name="name" path="path" />--><!--Context.getExternalCacheDir()--><!--<external-cache-path name="name" path="path" />--><external-pathname="download"path="/App/download/" />
</paths>

3.生成uri调用系统程序安装apk

/*** 安装apk** @param context* @param filePath 本地apk路径*/public static void installApk(Context context, String filePath) {try {File file = new File(filePath);Intent intent = new Intent(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION| Intent.FLAG_GRANT_WRITE_URI_PERMISSION| Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);Uri contentUri;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {contentUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", file);} else {contentUri = Uri.fromFile(file);}intent.setDataAndType(contentUri, "application/vnd.android.package-archive");List<ResolveInfo> resolveLists = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);if (resolveLists != null) {for (ResolveInfo resolveInfo : resolveLists) {if (resolveInfo != null && resolveInfo.activityInfo != null) {String packageName = resolveInfo.activityInfo.packageName;context.grantUriPermission(packageName, contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION| Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);}}}context.startActivity(intent);} catch (Exception e) {e.printStackTrace();}}

4.签名权限授予

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

参考链接:
https://developer.android.com/about/versions/nougat/android-7.0-changes?hl=zh-cn
https://developer.android.com/reference/android/support/v4/content/FileProvider.html?hl=zh-cn

Android 版本更新安装apk相关推荐

  1. android 代码 安装APK 解决了

    今晚查了很多资料,android代码安装APK BaseHelper.chmod("777", cachePath); Intent intent = new Intent(Int ...

  2. 解决Android Studio 安装APK时device support,but apk only supports armeabi-v7 问题

    报错信息: Android Studio 安装APK时出现 device support,but apk only supports armeabi-v7 问题出现原因: 这两天入职了新公司,公司统一 ...

  3. Android adb 安装 apk无法安装错误排查

    Android adb 安装 apk无法安装错误排查 过程描述 用锤子安装一个apk包,死活安装不上,直接安装apk报错[apk包解析错误],然后换成apk安装,adb报安装失败 但是nuex模拟器和 ...

  4. Android应用安装apk版本升级,适配Android 8.0和Android 10.0下载安装,shell命令安装APK

    shell命令安装 /*** 安装apk** @param path apk文件路径*/ public void installAPK(String path) {Log.i(TAG, "i ...

  5. android 电视安装apk文件损坏,android - 无法在Android电视盒上安装APK - 堆栈内存溢出...

    我正在为Android TV编写应用程序. 它可以在模拟器上正常运行,并在Android电视盒上以调试模式运行. 但是,当我使用Android Studio生成apk并尝试将该apk安装在同一盒子上时 ...

  6. android studio 安装apk失败,AndroidStudio安装apk时失败时提示INSTALL_PARSE_FAILED_NO_CERTIFICATES...

    安装apk时提示INSTALL_PARSE_FAILED_NO_CERTIFICATES错误,说明要安装的apk未进行签名,需签名后方可安装. 在android studio中增加签名方法,直接在ap ...

  7. 无法挂载sd卡(android),不能安装APK(1)

    1.应用程序下载的话是默认安装到/mnt/sdcard下的,如果你sd卡没挂载上,系统会提示你request an SD卡或者damage SD卡,所以此时你去这个/mnt/sdcard或者/sdca ...

  8. Android 如何安装APK

    简单记录下实现安装APK功能 /*** 安装APK** @param context 上下文* @param downloadApk APK路径*/public static void install ...

  9. Android 下载安装APK

    代码安装apk Intent i = new Intent(Intent.ACTION_VIEW); String filePath = "/sdcard/XXX.apk"; i. ...

最新文章

  1. as3 android白屏,Android 8.0中一些坑以及对应的解决方法
  2. 项目小结:日立OA系统(Asp.net)
  3. python统计文件大小_python工具--01.统计当前目录下的文件的大小
  4. 此时无足够的可用内存,无法满足操作的预期要求,可能是由于虚拟地址随便造成的。请稍候重试。 .
  5. powershell快捷键_借助Windows Terminal搞一个花里胡哨的PowerShell终端
  6. windows 下使用 nc 命令报错,与 Linux 不同。
  7. python的xml.dom学习笔记
  8. 开源中国大佬是怎么用Selenium做自动化web测试的
  9. Windows10自带应用的卸载和恢复
  10. JAVA中成员变量和局部变量区别
  11. 2.15范冰增长黑客读书笔记
  12. 2022 年项目经理薪酬趋势:找工作就这么谈
  13. 基于Pytorch的上市公司财务预警分析
  14. PV 操作与案例分析
  15. Android烟雾监控应用,基于Android的智能家庭监控系统研制
  16. Python基础:数据可视化1
  17. 机器人是如何实现对话的?
  18. openid会变吗?微信小程序开发中的appid、openid、unionid使用总结
  19. 蓝桥杯真题:平面分割
  20. ESP8266-Arduino编程实例-MCP23017并行IO扩展驱动

热门文章

  1. IP地址,MAC地址与域名地址
  2. Linux中rmp和yum命令配置
  3. mp4box的安装和使用
  4. 计算机二级python-第七章-文件和数据的格式化
  5. 2021计算机保研记录总结(已上岸计算所)
  6. 送书 | 《人工智能数学基础与Python机器学习实战》
  7. csdn 怎么 找到 草稿箱
  8. 鲍尔默加入Linux基金会
  9. DirectIO(O_DIRECT) 详解
  10. 【YOLOv7改进轻量化】第一章——引入轻量化骨干网络MobileOne