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不久,哪里写的不对的地方请多多指教。