6

FileProviderを使用してAndroid Nougatで写真を撮っています。それが私のコードです

<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:

<paths>
    <files-path name="img" path="images/" />
</paths>

ジャワ:

 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);

カメラ アクティビティが開始され、写真が正常に撮影されますが、アクティビティの結果が正常ではなく、エラー ログに表示されるのは次の 1 つだけです。

CAM_StateSavePic: 結果を URI に保存中の例外: Optional.of(content://com.mypackage.fileprovider/img/cameraOutput1469383289530.jpg) FileNotFoundException: ディレクトリです

EDIT 逃した File#createNewFile();

4

2 に答える 2

12

カメラとギャラリーの URI を機能させるための主な要素は、プロバイダー パスです。

/res/xml/ dir への provider_paths.xml を作成する必要があります

<?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>

もう1つ、次のようにApplicationクラスでvmPolicyを設定する必要があることがわかりました

@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());
}

マニフェスト ファイルでカメラと外部ストレージのアクセス許可を再確認すると、nougat URI が表示されます。

詳細については、このリンクを確認してください: Android N FileUriExposedException

于 2016-12-27T11:33:09.603 に答える