Android7.0 对文件做了限制,不能直接分享file://开头的uri,必须转换成content://开头的。
1.在Manifest.xml文件中添加:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.ateam.shippingcity.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
2.在res目录下添加xml子目录,并新建file_paths文件,名字随便,只要和manifest中定义的一致就可以。添加如下内容
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<!--<external-path path="" name="camera_photos" />-->
<!--下载apk-->
<external-path
name="sdcard_files"
path="" />
<!--相机相册裁剪-->
<external-files-path
name="camera_has_sdcard"
path="" />
<files-path
name="camera_no_sdcard"
path="" />
</paths>
</resources>
其中不同的标签代表不同的分享文件目录,包括app私有目录、外部存储目录、缓存目录等。
path是你需要分享的相对子目录。
name是别名,用来在Uri中替换具体的path
3.生成uri
private void dispatchTakePictureIntent() {
Intent intent_photo = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent_photo.resolveActivity(getPackageManager()) != null) {
FileUtil.getInstance().createSDDir(SAVED_IMAGE_DIR_PATH);
String fileName = System.currentTimeMillis() + ".jpg";
File file = FileUtil.getInstance().createFileInSDCard(SAVED_IMAGE_DIR_PATH, fileName);
if (file != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
fileUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", file);//通过FileProvider创建一个content类型的Uri
intent_photo.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
} else {
fileUri = Uri.fromFile(file);
}
}
intent_photo.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(intent_photo, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
} else {
MyToast.showShort(this, "无法启动相机");
}
}
4.最后拿到fileUri.getPath,进行预览、裁剪、上传等等操作;但是要注意一点,由于上面file_paths文件中有命名一个name,那么就要注意路径的问题了,不然是拿不到图片的。(比如现在拿到的路径是/storage/emulated/0/sdcard_files/xxxxxx.jpg,如果是这样的话你是拿不到图片的,必须把中间的sdcard_files这个name去掉才行)