源码链接:
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以上的系统。那别忘了还有个未知来源的权限需要申请下:
E:还有有的可能用的系统自带的DownloadManager进行下载。这个时候也要注意:
Android 7.0 或更高版本开发的应用在尝试访问DownloadManager.COLUMN_LOCAL_FILENAME时会触发java.lang.SecurityException.取而代之的是:DownloadManager.COLUMN_LOCAL_URI。
F:最后还是解析失败,就再看看自己该给的权限是否都申请了。例如:存储权限。
具体实现请看上面的例子.
每日语录:
你现在的努力,辛苦,压力,承受的一切,都是为了攒够能力和本钱,去做自己更喜欢的事,去为自己争取选择的权利。 加油!!!
单曲循环《你知道我在等你吗》 一首很好听的老歌。。。