Android用FileProvider拍照 [英] Android taking picture with FileProvider
问题描述
我正在使用FileProvider在Android Nougat上拍照,这就是我的代码
I'm taking a picture on Android Nougat with FileProvider, that's my code
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.mypackage.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
file_paths.xml:
file_paths.xml:
<paths>
<files-path name="img" path="images/" />
</paths>
Java:
String fileName = "cameraOutput" + System.currentTimeMillis() + ".jpg";
File imagePath = new File(getContext().getFilesDir(), "images");
File file = new File(imagePath, fileName);
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
final Uri outputUri = FileProvider.getUriForFile(activity, "com.mypackage.fileprovider", file);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
getContext().grantUriPermission(
"com.google.android.GoogleCamera",
outputUri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION
);
cameraIntent.setFlags(FLAG_GRANT_WRITE_URI_PERMISSION);
activity.startActivityForResult(cameraIntent, ACTIVITY_REQUEST_CODE);
相机活动开始,可以成功拍照,但是活动结果不正确,我在错误日志中看到的唯一内容是
Camera activity starts, take picture successfully, but the Activity Result is not OK and the only thing I see in error logs is
CAM_StateSavePic:将结果保存到URI时发生异常:可选.of(content://com.mypackage.fileprovider/img/cameraOutput1469383289530.jpg) FileNotFoundException:是目录
CAM_StateSavePic: exception while saving result to URI: Optional.of(content://com.mypackage.fileprovider/img/cameraOutput1469383289530.jpg) FileNotFoundException: Is a directory
编辑 错过了File#createNewFile();
EDIT missed File#createNewFile();
推荐答案
使相机和图库URI工作的主要方法是提供程序路径.
The main thing to get camera and gallery URI working is provider paths.
您需要创建一个到/res/xml/dir的provider_paths.xml
you need to create a provider_paths.xml to /res/xml/ dir
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
在清单文件中,在
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths">
</provider>
还有一件事,我发现我们需要像这样在Application类中设置vmPolicy
One more thing, I've found that we need to set vmPolicy in Application class like this
@Override
public void onCreate() {
super.onCreate();
//Allowing Strict mode policy for Nougat support
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
}
仔细检查清单文件中的相机和外部存储权限,然后使用牛轧糖URI.
Double check your camera and external storage permission in manifest file and there you go with nougat URI.
有关更多详细信息,请检查以下链接: Android N FileUriExposedException
For more details check this link : Android N FileUriExposedException
这篇关于Android用FileProvider拍照的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!