android 7.0以上版本安装问题

2021-04-17  本文已影响0人  会写代码的小猿猴

在开发公司的app过程中都需要加入app的自动更新,首先在平板上弄得挺好的,一切更新都正常,后面换在新机器上面就直接崩溃了,查了原因是因为7.0以上的版本都有文件权限的要求,所以写下这篇文章记录一下这个坑。

7.0以上版本要想安装软件需要用到fileProvider

首先需要在AndroidManifest.xml文件里面进行相关的配置:

配置如下:

<provider

    android:name="androidx.core.content.FileProvider"

    android:authorities="${applicationId}.fileprovider"

    android:exported="false"

    android:grantUriPermissions="true">

    <meta-data

        android:name="android.support.FILE_PROVIDER_PATHS"

        android:resource="@xml/file_paths" />

</provider>

这段要放在<application>和</application>之间,上面的一些参数我就不一一介绍了,包名也被我用${applicationId}代替了,都是可以通用的,感兴趣的码友们可以去了解一下

放上这段代码后你会发ixian你会发现 android:resource="@xml/file_paths" />报红了,因为你没有file_paths.xml文件,这个文件就是一个文件访问权限路径的配置,我在这里也贴出来给大家看看吧。

<paths>

    <external-path

        name="external_storage_root"

        path="." />

    <files-path

        name="files-path"

        path="." />

    <cache-path

        name="cache-path"

        path="." />



    <external-files-path

        name="external_file_path"

        path="." />

    <!--代表app 外部存储区域根目录下的文件 Context.getExternalCacheDir目录下的目录-->

    <external-cache-path

        name="external_cache_path"

        path="." />

    <!--配置root-path。这样子可以读取到sd卡和一些应用分身的目录,否则微信分身保存的图片,就会导致 java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/999/tencent/MicroMsg/WeiXin/export1544062754693.jpg,在小米6的手机上微信分身有这个crash,华为没有-->

    <root-path

        name="root-path"

        path="" />

    </paths>

下面再给大家看看他的位置,位置是在res下新建一个xml文件夹,然后再新建一个xml格式的文件。


image.png

最后就是安装的的代码了,在你需要进行安装的位置调用以下方法:

private void installApk() {
    File apkfile = new File(saveFileName);
    Intent i = new Intent(Intent.ACTION_VIEW);
    if (Build.VERSION.SDK_INT >= 24) { //适配安卓7.0
        i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK);
        Uri apkFileUri = FileProvider.getUriForFile(mContext.getApplicationContext(),
                mContext.getPackageName() + ".fileprovider", apkfile);
        i.setDataAndType(apkFileUri, "application/vnd.android.package-archive");
    } else {
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        i.setDataAndType(Uri.parse("file://" + apkfile.toString()),
                "application/vnd.android.package-archive");// File.toString()会返回路径信息
    }
    mContext.startActivity(i);
}

参数说明:saveFileName是你下载apk文件存放的路径,mContext这个就不说了,懂的人都懂。

好了,差不多就是这些了,希望各位大神留言讨论,我也是刚入门android不久,哪里写的不对的地方请多多指教。

上一篇 下一篇

猜你喜欢

热点阅读