概述
对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file://URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并现 FileUriExposedException 异常。要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider类。
FileProvider的使用
- 1.AndroidManiFest.xml添加:
<provider
android:name="com.baidu.MyProvider" //自定义provider继承FileProvider
android:authorities="应用包名.fileProvider"
android:exported="false" //必须是false
android:grantUriPermissions="true"> //必须是true
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" /> //在res目录下面建立xml文件夹下创建 文件名为provider_paths
</provider>
- 2.MyFileProvider只需继承FileProvider 空实现
public class MyProvider extends FileProvider {
@Override
public boolean onCreate() {
return super.onCreate();
}
}
- 3.provider_paths文件
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!--文件权限配置-->
<!--1、对应内部内存卡根目录:Context.getFileDir()-->
<files-path
name="root"
path="/" />
<!--2、对应应用默认缓存根目录:Context.getCacheDir()-->
<cache-path
name="cache"
path="/" />
<!--3、对应外部内存卡根目录:Environment.getExternalStorageDirectory()-->
<external-path
name="path"
path="/" />
<external-path
name="ext_root"
path="pictures/" />
<!--4、对应外部内存卡根目录下的APP公共目录:Context.getExternalFileDir(String)-->
<external-files-path
name="ext_pub"
path="/" />
<!--5、对应外部内存卡根目录下的APP缓存目录:Context.getExternalCacheDir()-->
<external-cache-path
name="ext_cache"
path="/" />
</paths>
- 4.Log查看对应File的目录信息(cn.evun.touchdemo是应用报名)
File filesDir = this.getFilesDir();//内存卡根目录
Log.e(TAG, "getFilesDir==> "+filesDir);
File cacheDir = getCacheDir();//内存卡缓存目录
Log.e(TAG, "getCacheDir==> "+cacheDir);
File storageDirectory = Environment.getExternalStorageDirectory();//外部储存卡根目录
Log.e(TAG, "Environment.getExternalStorageDirectory==> "+storageDirectory);
File externalFilesDir = getExternalFilesDir(null);//外部储存卡公共目录
Log.e(TAG, "getExternalFilesDir==> "+externalFilesDir);
File lishuai = getExternalFilesDir("lishuai");
Log.e(TAG, "getExternalFilesDir(\"lishuai\")==> "+lishuai);
File externalCacheDir = getExternalCacheDir();//外部储存卡缓存目录
Log.e(TAG, "getExternalCacheDir()==> "+externalCacheDir);
- 5.修改所有用到 Uri 的地方,如相机拍照
Intent intent;
String picPath=Environment.getExternalStorageDirectory()+File.separator+System.currentTimeMillis()+".jpg";
if (Build.VERSION.SDK_INT > 23) {
intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File f = new File(picPath);
Uri imageUri= FileProvider.getUriForFile(this,"com.baidu.fileProvider", f);
intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, REQUEST_CODE_SELECT_GRAINT_URI_FROM_CAMERA);
} else {
intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File f = new File(picPath);
Uri u = Uri.fromFile(f);
intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
intent.putExtra(MediaStore.EXTRA_OUTPUT, u);
startActivityForResult(intent, REQUEST_CODE_SELECT_PIC_FROM_CAMERA);
}