Android7.0应用程序自助更新跳转安装界面出现解析包出错

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31588719/article/details/77224049

安卓APP检测到新版本,用户同意更新后,就到服务器下载最新的APP,下载到一个文件夹内,通过固定写法:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://"+filePath), "application/vnd.android.package-archive");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

即可跳转到安装界面,实现覆盖安装。但随着安卓版本升级,谷歌越来越收紧了相关权限,如Android6.0引入动态权限控制(Runtime Permissions),Android7.0引入私有目录被限制访问和StrictMode API。如果不去了解这些权限的改动,在实际开发会遇到某些问题。

如下是我在7.1设备上进入DDMS后查看手机目录截图

在7.0一下的设备,data/data/到这级目录下就是应用程序的包文件夹,都是允许打开查看,但是对于7.0设备,发现这个第一个data文件夹都无法打开,点不进去,看后面的权限列,发现最后一组是 - - x,也就是说没有读写权限。我认为,这就是为什么我们用平常的访问方式访问到自己应用程序下面文件那个下载好的apk,然后让它跳转安装界面出现无法解析的问题,程序都没有权限访问到这个文件夹,更别提能读取到里面的apk文件了。经过查阅官方文档,原来我们要进行如下几部操。
1.在res目录下新建xml资源文件夹和一个resources文件,上面那行我注释掉的代码是访问sd卡的,下面的files是程序包下面的文件夹,因为手机没SD卡,有存到应用程序包下面的files文件夹中。


内容为:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <!--<external-path path="" name="download"/>-->
        <files-path path ="" name = "download"/>
    </paths>
</resources>

2.在Manifest文件里面添加
<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.dafangya.app.pro.fileprovider"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>
3.在java代码中我是这么处理的
if(Build.VERSION.SDK_INT>=24) {//判读版本是否在7.0以上
    Uri apkUri = FileProvider.getUriForFile(SplashActivity.this, "com.dafangya.app.pro.fileprovider", file);
    Intent install = new Intent(Intent.ACTION_VIEW);
    install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
    install.setDataAndType(apkUri, "application/vnd.android.package-archive");
    startActivity(install);
}else {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.parse("file://"+filePath), "application/vnd.android.package-archive");
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    dialog_progress.dismiss();
}
当Android版本在7.0以上时,采用临时授权的方式读取到该APK,其中file就是那个apk文件 file=new File(filePath),filePath就是指到
这个apk文件。当在7.0以下时,就采用常规方式跳转覆盖安装。
小提示:如果在7.0一下出现解析包出错,请去看我的另外一片博文,上面有写解决方案,绝对能够搞定!!!
传送地址~~~点击打开链接

猜你喜欢

转载自blog.csdn.net/qq_31588719/article/details/77224049
今日推荐