解决 Android N 上报错:android.os.FileUriExposedException: file:///storage/emulated/0/

2017-01-14 08:48:06来源:CSDN作者:tsdfk1455人点击

第七城市

解决android N文件访问crash android.os.FileUriExposedException file:///storage/emulated/0/xxx

原因:

Android N对访问文件权限收回,按照Android N的要求,若要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。
而进行此授权的最简单方式是使用 FileProvider类。

解决方法:

1.在mainfest中加入FileProvider注册

<application> ......     <provider         android:authorities="你的应用名.fileprovider"         android:name="android.support.v4.content.FileProvider"         android:grantUriPermissions="true"         android:exported="false">         <meta-data           android:name="android.support.FILE_PROVIDER_PATHS"               android:resource="@xml/filepaths"/>    </provider></application>


2.配置filepaths文件

<?xml version="1.0" encoding="utf-8"?><paths>    <external-path path="honjane/" name="files_path" /></paths>

其中:
代表的根目录: Context.getFilesDir()
代表的根目录: Environment.getExternalStorageDirectory()
代表的根目录: getCacheDir()

<external-path path="honjane/" name="files_path" />

path 代表要共享的目录
name 只是一个标示,随便取吧 自己看的懂就ok

举个栗子:通过provider获取到的uri链接

content://com.honjane.providerdemo.fileprovider/files_path/files/b7d4b092822da.pdf

name对应到链接中的files_path

path对应到链接中的 files ,当然files是在honjane/目录下

3.访问文件

 /**     * 打开文件     * 当手机中没有一个app可以打开file时会抛ActivityNotFoundException     * @param context     activity     * @param file        File     * @param contentType 文件类型如:文本(text/html)          */    public static void startActionFile(Context context, File file, String contentType) throws ActivityNotFoundException {        if (context == null) {            return;        }        Intent intent = new Intent(Intent.ACTION_VIEW);        intent.addCategory(Intent.CATEGORY_DEFAULT);        intent.setDataAndType(getUriForFile(context, file), contentType);        if (!(context instanceof Activity)) {            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        }        context.startActivity(intent);    }    /**     * 打开相机     *     * @param activity    Activity     * @param file        File     * @param requestCode result requestCode     */    public static void startActionCapture(Activity activity, File file, int requestCode) {        if (activity == null) {            return;        }        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        intent.putExtra(MediaStore.EXTRA_OUTPUT, getUriForFile(activity, file));        activity.startActivityForResult(intent, requestCode);    }    private static Uri getUriForFile(Context context, File file) {        if (context == null || file == null) {            throw new NullPointerException();        }        Uri uri;        if (Build.VERSION.SDK_INT >= 24) {            uri = FileProvider.getUriForFile(context.getApplicationContext(), "你的应用名.fileprovider", file);        } else {            uri = Uri.fromFile(file);        }        return uri;    }

同样访问相机相册都通过FileProvider.getUriForFile申请临时共享空间
已写成工具类上传到github,需要直接下载
使用方法简单,一行代码搞定
打开文件:

 try {      FileUtils.startActionFile(this,path,mContentType);    }catch (ActivityNotFoundException e){ }

调用相机:

 FileUtils.startActionCapture(this, file, requestCode);

代码下载:https://github.com/honjane/fileProviderDemo

第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台