Android用FileProvider拍照 [英] Android taking picture with FileProvider

查看:267
本文介绍了Android用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆