根据google官网得知,在8.0以上权限控制的更加严格,应用内安装下载更新的apk都需要申请“安装外面应用”权限才能去安装新应用,如果没有申请否则无法安装。

顺便附上6.0、7.0设备解决方案:

一、设备6.0

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
   private fun requestPermissions() {val permissionsList = arrayListOf(Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE)if (ContextCompat.checkSelfPermission(this,  permissionsList[0])!= PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,  permissionsList[1])!= PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(this, permissionsList.toTypedArray(), 100)}}override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {super.onRequestPermissionsResult(requestCode, permissions, grantResults)if (grantResults.isNotEmpty() && requestCode == 100) {//授权后操作哦} else {Toast.makeText(this, "请开启相关权限!", Toast.LENGTH_LONG).show()}}

二、设备7.0 ,在以上代码上新增如下:

1.需要在AndroidManifest.xml中配置FileProvider

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

2.xml目录下新建file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths><root-pathname="external_storage_root"path="." /><root-pathname="camera_photos"path="." /><root-pathname="files_root"path="." /><root-pathname="files_root"path="." /><root-pathname="external_files"path="." />
</paths>

三、设备8.0+

1.在 AndroidManifest.xml新增权限:

 <!--android O更新了未知来源的权限--><uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

四、 打开安装包的代码

public class InstallUtil {private Activity mAct;private String mPath;//下载下来后文件的路径public static int UNKNOWN_CODE = 2018;public InstallUtil(Activity mAct, String mPath) {this.mAct = mAct;this.mPath = mPath;}public void install() {try {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {startInstallO();} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {startInstallN();} else {startInstall();}} catch (Exception e) {e.printStackTrace();}}/*** android1.x-6.x*/public void startInstall() throws Exception {Intent install = new Intent(Intent.ACTION_VIEW);install.setDataAndType(Uri.parse("file://" + mPath), "application/vnd.android.package-archive");install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);mAct.startActivity(install);}/*** android7.x*/public void startInstallN() throws Exception {//参数1 上下文, 参数2 在AndroidManifest中的android:authorities值, 参数3  共享的文件Uri apkUri = FileProvider.getUriForFile(mAct, getAuthority(mAct, ".FileProvider"), new File(mPath));Intent install = new Intent(Intent.ACTION_VIEW);//由于没有在Activity环境下启动Activity,设置下面的标签install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//添加这一句表示对目标应用临时授权该Uri所代表的文件install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);install.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);install.setDataAndType(apkUri, "application/vnd.android.package-archive");mAct.startActivity(install);}/*** android8.x*/@RequiresApi(api = Build.VERSION_CODES.O)private void startInstallO() throws Exception {boolean isGranted = mAct.getPackageManager().canRequestPackageInstalls();if (isGranted) {startInstallN();//安装应用的逻辑(写自己的就可以)} else {new AlertDialog.Builder(mAct).setCancelable(false).setTitle("安装应用需要打开未知来源权限,请去设置中开启权限").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface d, int w) {//https://blog.csdn.net/changmu175/article/details/78906829Uri packageURI = Uri.parse("package:" + mAct.getPackageName());//注意这个是8.0新APIIntent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);mAct.startActivityForResult(intent, INSTALL_PERMISS_CODE);}}).show();}}/*** 获取FileProvider* 返回: "此处为你的包名.FileProvider"* china.test.provider*/private String getAuthority(Context context, String authority) {return getAppProcessName(context) + authority;}/*** 获取当前应用程序的包名** @param context 上下文对象* @return 返回包名*/private String getAppProcessName(Context context) {//当前应用pidint pid = android.os.Process.myPid();//任务管理类ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);//遍历所有应用List<ActivityManager.RunningAppProcessInfo> infos = manager.getRunningAppProcesses();for (ActivityManager.RunningAppProcessInfo info : infos) {if (info.pid == pid)//得到当前应用{return info.processName;//返回包名}}return "";}
}

五、运行后发现还是有问题、安装失败

在app.gradle中添加signingConfigs配置,这样在不打包的前提下也可以安装成功啦!


android { defaultConfig { … } signingConfigs {debug {storeFile file("./xxx.keystore")storePassword 'password'keyAlias 'xxx'keyPassword 'password'}release {storeFile file("./xxx.keystore")storePassword 'password'keyAlias 'xxx'keyPassword 'password'v2SigningEnabled false}}

参考文献:

android 6.0以上系统部分需要动态授权代码_一直向钱的博客-CSDN博客

Android8.0+应用内更新安装apk失败_fplei的博客-CSDN博客

android 7.0、8.0、9.0适配时遇到更新安装问题解决_Bentley_li的博客-CSDN博客

Android8.0 允许安装未知来源权限(一)_飞奔的小付的博客-CSDN博客

记 Android 7.0 8.0版本更新安装遇到的坑 - 简书

android 调用系统播放器播放视频,适配android 7.0以上_书中有颜如玉的博客-CSDN博客_android 调用系统播放器

Android8.0、9.0安装包解析失败相关推荐

  1. 【Android】 安装时安装包解析失败

    可能原因 用户的安卓系统版本过低 此处设置的最小sdk版本为20,对应于安卓4.4W 安卓版本低于4.4W的手机,安装时都会出现安装包解析失败的情况

  2. 华为mate 30 安装时提示安装包解析失败

    今天遇到一个问题,从服务器端下载的apk,安装的时候,提示解析包失败. 我本地也有一个包,自己的红米android9.0 可以下载安装,邮件发给用户,用户说依然报解析包失败. 然后,我给安装包apk通 ...

  3. 安卓 app 本地升级下载后自动安装(小米手机安装包解析失败问题)

    强制升级: 1.新建服务 package com.jy.mango.project.service; import android.app.DownloadManager; import androi ...

  4. Android小米5安装包解析失败问题

    Android 解决7.0系统应用升级时下载APK安装时解析错误问题 在startActivity是添加Intent.FLAG_GRANT_READ_URI_PERMISSION Intent ins ...

  5. Android——app内打开安装包,安装包解析失败

    7.0,8.0以上安装权限都配置完毕,Provider也配置完毕 检查是否有读写权限 <uses-permission android:name="android.permission ...

  6. android_真机调试_安装包解析失败

    File→Settings→Bulid,Excution,Deployment→InstantRun 这样就解决问题了

  7. Android 9.0 安装包解析错误

    Android studio打包的debug和release 包 安装到android9.0版本 提示安装包解析错误,因为之前在 manifest文件里面为了解决androidx冲突问题,在appli ...

  8. 用java下载apk解析包出错_Android 9.0 安装包解析错误 java.lang.SecurityException: Permission Denial解决方案...

    在android 9.0自动下载更新时 遇到 安装包解析错误 错误示例.png 在android 7.0使用的是同一套框架却没有问题? 然后通过adb命令抓取一下异常发现 12-18 19:21:32 ...

  9. android8.1APP更新时出现安装包解析异常的提示

    机型:华为P20pro 系统: android8.1 场景:打开APP提示更新,点击立即更新,出现下载进度条框,然后停顿一两秒弹出安装包解析异常: 说明:网上这个问题的原因很多,但我的都不符合:比如权 ...

最新文章

  1. PHP更新数据库记录
  2. Web自动化测试 六 ----- selector选择
  3. sql发送邮件 html,T-SQL;如何在表之前和之后以HTML格式使用sp_send_dbmail
  4. 关于清单,有几点我觉得比较重要。
  5. elasticsearch分词聚合查询demo
  6. C#Convert.ToInt32(bool)方法-将bool值转换为int
  7. Intel Core Enhanced Core架构/微架构/流水线 (12) - 数据预取
  8. Unity3d 屏幕空间人体皮肤知觉渲染次表面散射Screen-Space Perceptual Rendering Subsurface Scattering of Human Skin...
  9. anaconda安装——添加镜像源
  10. ajax跨域原理以及jsonp使用
  11. WinRAR压缩文件参数详解
  12. 寂寞不归路-软件高手是这样练成的(转载)
  13. 蓝桥杯——算法训练——P0704
  14. 【Nginx基础知识】
  15. 地图与WebGIS、地图的作用、数字地图的应用
  16. mysql优化总结(四)
  17. ubuntu linux下直观的网络流量监控
  18. 槟城usm大学计算机专业怎么样,马来西亚理科大学USM比你想的好太多了!
  19. 基于C语言开发Linux平台的协议分析软件
  20. win10无法连接网络里的其他计算机名,win10系统无法访问局域网的其他电脑的解决办法...

热门文章

  1. 碳纳米管包四氧化三铁Fe3O4纳米粒子|氧化石墨烯包覆Fe3O4空心球纳米复合材料(r-GO/Fe3O4)|齐岳
  2. <C++>详解运算符重载之前置递增和后置递增
  3. java两个list合并 去重_java 快速合并去重List
  4. JOOQ 报错 StackOverflowError
  5. C# Setting.settings . 配置用法
  6. 《趣味知识博文》小W与小L带你聊天式备考CDA Level Ⅰ(五)
  7. 【Mac使用系列】Mac锁屏及快捷键
  8. Tessy有linux版本吗,用mkisofs制作iso文件
  9. Mixin 函数的详细解析
  10. 练习1-10 人生若只如初见,何事秋风悲画扇