Android targetSdkVersion 26 升级后 应用内部版本更新失败的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zy987654zy/article/details/83306445

关于 targetSdkVersion 升级后,造成应用内部版本更新,无反应的问题。

问题1. Android 7.0系统,无法进行版本升级,提示文件解析失败。

例如:
在这里插入图片描述
找到的原因 在于,Android api 24后,对于文件权限进行了限制。 类似苹果的沙盒模式,应用创建的文件夹,其他应用无权限访问。 然后就会出现上面的问题了。

解决方法

第一步: 在res文件夹下面 创建xml文件夹。创建一个文件。文件名称:files_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path path="." name="文件名称自定义"/>
        <files-path path ="." name = "文件名称自定义"/>
        <cache-path path ="." name = "文件名称自定义"/>
    </paths>
</resources>

关于 内部的element 关系对应如下:
files-path(Context.getFilesDir()); 如果是自己在sd卡中创建的文件,可以用这个就可以了。
cache-path(Context.getCacheDir());
external-path(Environment.getExternalStorageDirectory());
external-files-path(Context.getExternalFilesDir());
external-cache-path(Context.getExternalCacheDir()),

第二步: 在AndroidManifest.xml 文件总添加 provider

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
                  
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/files_paths" />
        </provider>

第三步:在安装app的地方调整方式

 File apkfile : 这个是你的apk文件地址对象。

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Uri apkUri = FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID + ".provider", apkfile);  // 这个地方 关键
            Intent install = new Intent(Intent.ACTION_VIEW);
            install.setDataAndType(apkUri, "application/vnd.android.package-archive");
            install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
            mContext.startActivity(install);
        } else {
            Intent i = new Intent(Intent.ACTION_VIEW);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            i.setDataAndType(Uri.parse("file://" + apkfile.toString()),
                    "application/vnd.android.package-archive");
            mContext.startActivity(i);
        }

问题2:如果是Android 8.0系统,不会出现提示解析错误,而是会出现下面的错误日志

 Process: com.demp.text, PID: 312522
    android.os.FileUriExposedException: file:///storage/emulated/0/xxx/download/xxx.apk exposed beyond app through Intent.getData()
        at android.os.StrictMode.onFileUriExposed(StrictMode.java:1975)
        at android.net.Uri.checkFileUriExposed(Uri.java:2363)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:9975)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:9929)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1622)
        at android.app.Activity.startActivityForResult(Activity.java:4751)
        at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)
        at android.app.Activity.startActivityForResult(Activity.java:4691)
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:751)
        at com.demp.text.FActivity.startActivityForResult(FActivity.java:313)
        at android.app.Activity.startActivity(Activity.java:5112)
        at android.app.Activity.startActivity(Activity.java:5080)
        at com.demp.text.FActivity.startActivity(FActivity.java:316)
        at com.demp.text.updata.UpdateManager.installApk(UpdateManager.java:244)
        at com.demp.text.updata.UpdateManager.access$400(UpdateManager.java:30)
        at com.demp.text.updata.UpdateManager$1.handleMessage(UpdateManager.java:92)
        at android.os.Handler.dispatchMessage(Handler.java:108)
        at android.os.Looper.loop(Looper.java:166)
        at android.app.ActivityThread.main(ActivityThread.java:7425)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

这个问题的解决方法 和Android 7.0 的出现的解析错误一样的解决方案。

问题3: Android 8.0 版本下载后,无反应,也不报错。也没有上面两个问题的错误情况。

这问题的原因是在于Android 8.0后,对于安装未知应用进行了权限划分。主要是为了避免app在之后的版本升级中。进行类似全家桶应用的安装。

解决方法: 添加允许安装未知应用市场权限,这个权限不是动态权限,所以不用进行动态申请。

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

个人感觉,这个权限的作用就是为了在后续进行回收应用本身的版本更新功能。 以后的android端app升级操作也可能会类似苹果市场,所有的更新都需要应用市场进行审核后才能进行下放升级操作了。

展开阅读全文

没有更多推荐了,返回首页