Android 7.0及其以上系统安装安装包时候提示:解析安装包失败

源码链接:

DownLoadManager下载demo,适配7.0,8.0

我们知道 从7.0以后。Android对隐私的保护力度也越来越大。从Android6.0引入的动态权限控制(Runtime Permissions)到Android7.0的“私有文件夹被限制訪问”,“StrictMode API 政策”。这就要求我们需要我们在安装应用的时候做一些适配.

7.0之前:

Intent intent = new Intent(Intent.ACTION_VIEW);
// 由于没有在Activity环境下启动Activity,设置下面的标签
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(downloadedUri, "application/vnd.android.package-archive");
context.startActivity(intent);

7.0之后:我们需要用到FileProvider.

Intent intent = new Intent(Intent.ACTION_VIEW);
File file = (new File(apkPath));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri apkUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", file);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
context.startActivity(intent);

但是今天在使用的时候下载成功以后。跳到安装界面的时候。报错:解析安装包失败.进到下载目录看了下。apk确实完整下载下来了。那为什么会安装不上呢。

原因:

   intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
          intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    }

//这两句话的顺序整反了。我写的是:
  
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
     intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
  }                   
 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

我先调用的是addFlags再调用的setFlags。我们点进去就可以看到

public @NonNull Intent setFlags(@Flags int flags) {
        mFlags = flags;
        return this;
 }

public @NonNull Intent addFlags(@Flags int flags) {
        mFlags |= flags;
        return this;
}

setFlags是直接赋值的。而addFlags是|= 也就是+=;我先add再set就会把前面Intent.FLAG_GRANT_READ_URI_PERMISSION)覆盖掉。导致解析安装包失败。

解决办法:都用addFlags().就没有顺序之分。要是一个setFlags().一个addFlags()。那。addFlags要放set后面。

7.0以上系统安装apk失败的原因总结:

A:看下apk是否完整的下载下来。(找到你的下载路径下。点击看看能不能安装。如果可以。就说明下载成功了。)

B:看下是不是用的FileProvider。FileProvider使用是否正确。把路径都打印下来看看。

C:看下是不是和我犯一样的错误。setFlags和addFlags顺序。

D:如果是8.0以上的系统。那别忘了还有个未知来源的权限需要申请下:

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

E:还有有的可能用的系统自带的DownloadManager进行下载。这个时候也要注意:

Android 7.0 或更高版本开发的应用在尝试访问DownloadManager.COLUMN_LOCAL_FILENAME时会触发java.lang.SecurityException.取而代之的是:DownloadManager.COLUMN_LOCAL_URI。

具体实现请看上面的例子.

每日语录:

你现在的努力,辛苦,压力,承受的一切,都是为了攒够能力和本钱,去做自己更喜欢的事,去为自己争取选择的权利。 ​​​​加油!!!

单曲循环《你知道我在等你吗》 一首很好听的老歌。。。

猜你喜欢

转载自blog.csdn.net/androidzmm/article/details/81703515