本文主要是介绍Android7.0以上(自动安装)文件访问报异常android.os.FileUriExposedException: file:///storage/emulated/0/app/****,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
了解了一下出现问题的原因:Android N(对应sdk24)(版本7.0)及以上对访问文件权限收回,按照Android N的要求,若要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。
而进行此授权的最简单方法:使用 FileProvider类。
步骤一:在AndroidManifest.xml文件中注册一个provider
<provider//这里是自己应用的包名android:authorities="自己的包名.fileprovider"android:name="android.support.v4.content.FileProvider"android:grantUriPermissions="true"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"//在res中建立一个xml文件夹,在文件夹中创建filepaths.xml文件android:resource="@xml/filepaths"/></provider>
步骤二:创建filepaths.xml文件
<?xml version="1.0" encoding="utf-8"?>
<paths><external-pathname="external_path"path="app/" /></paths>
上面的两个属性要根据自己的使用来配置。
其中 <external-path> 就是手机的外置存储目录。
path="自己共享的目录"
其他节点说明:
<!--代表外部存储区域的根目录下的文件 Environment.getExternalStorageDirectory()/DCIM/XX目录-->
<external-path name="hm_DCIM" path="DCIM/XX" />
<!--代表外部存储区域的根目录下的文件 Environment.getExternalStorageDirectory()/Pictures/XX目录-->
<external-path name="hm_Pictures" path="Pictures/XX" />
<!--代表app 私有的存储区域 Context.getFilesDir()目录下的images目录 /data/user/0/com.hm.camerademo/files/images-->
<files-path name="hm_private_files" path="images" />
<!--代表app 私有的存储区域 Context.getCacheDir()目录下的images目录 /data/user/0/com.hm.camerademo/cache/images-->
<cache-path name="hm_private_cache" path="images" />
<!--代表app 外部存储区域根目录下的文件 Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)目录下的 Pictures目录-->
<!--/storage/emulated/0/Android/data/com.hm.camerademo/files/Pictures-->
<external-files-path name="hm_external_files" path="Pictures" />
<!--代表app 外部存储区域根目录下的文件 Context.getExternalCacheDir目录下的images目录-->
<!--/storage/emulated/0/Android/data/com.hm.camerademo/cache/images-->
<external-cache-path name="hm_external_cache" path="" />
<!--/storage/emulated/0/app/下的目录 内部存储-->
<external-path name="external-path" path="app/" />
步骤三:应用内自动安装
private Intent getInstallIntent() {String fileName = savePath + appName + ".apk";Uri uri = null;Intent intent = new Intent(Intent.ACTION_VIEW);try {if (Build.VERSION.SDK_INT >= 24) {//7.0 Android N //com.xxx.xxx.fileprovider为上述manifest中provider所配置相同uri = FileProvider.getUriForFile(mContext, "你自己的包名.fileprovider", new File(fileName));intent.setAction(Intent.ACTION_INSTALL_PACKAGE);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//7.0以后,系统要求授予临时uri读取权限,安装完毕以后,系统会自动收回权限,该过程没有用户交互} else {//7.0以下uri = Uri.fromFile(new File(fileName));intent.setAction(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}intent.setDataAndType(uri, "application/vnd.android.package-archive");startActivity(intent);return intent;} catch (IllegalArgumentException e) {e.printStackTrace();}catch (ActivityNotFoundException e){e.printStackTrace();}catch (Exception e){e.printStackTrace();}return intent;}
这样就顺利解决访问文件权限的问题了,完成自动安装
这篇关于Android7.0以上(自动安装)文件访问报异常android.os.FileUriExposedException: file:///storage/emulated/0/app/****的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!