1. ホーム
  2. アンドロイド

FileUriExposedException: file:///XX/XXXXXX g が ClipData.Item.getUri() によってアプリの外部に公開される問題は解決された。

2022-03-16 11:04:05

FileUriExposedException: file:XXXXXXXXX が ClipData.Item.getUri() によってアプリを超えて公開される問題は解決された。

少し前に、写真を撮ることに関するAppのコードを書いてAndroid 7.0に対応させたので、うちのボスのHuaweiのスマホが遊びに来て、こっそりAndroid 7.0にバージョンアップしてテストしていたら、問題が発生、やっかいなことになったのです。

FileUriExposedException: file:XXXXXXXXX g が ClipData.Item.getUri() によりアプリを超えて公開されました。

このエラー、特に次のClipData.Item.getUri()を通してアプリを超えて公開されているのは何なのか、それすら理解できなかったので、解決策としてネットで調べてみると、こんなことが書かれていました。
 case ChatBottomView.FROM_CAMERA:// camera
                        if (!CAN_WRITE_EXTERNAL_STORAGE) {
                            Toast.makeText(ServiceChatActivity.this, "Permissions not opened \nPlease go to Settings to open album permissions", Toast.LENGTH_SHORT).show();
                        } else {
                            Intent openCameraIntent = new Intent(
                                    MediaStore.ACTION_IMAGE_CAPTURE);
                            camPicPath = PathUtils.getSavePicPath(ServiceChatActivity.this);
                            if (Build.VERSION.SDK_INT < 24){
                                Uri uri = Uri.fromFile(new File(camPicPath));
                                openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                                startActivityForResult(openCameraIntent,
                                        ChatBottomView.FROM_CAMERA);
                            }else {
                                //adapt to Android 7.0
                                ContentValues contentValues = new ContentValues( 1 );
                                contentValues.put( MediaStore.Images.Media.DATA,
                                        camPicPath);
                                Uri uri = getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues );
                                grantUriPermission( "com.example.lab.android.nuc.chat",uri,Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
                                openCameraIntent.addFlags( Intent.FLAG_GRANT_READ_URI_PERMISSION );
                                openCameraIntent.addFlags( Intent.FLAG_GRANT_WRITE_URI_PERMISSION ); openCameraIntent.addFlags( Intent.FLAG_GRANT_WRITE_URI_PERMISSION );
                                openCameraIntent.putExtra( MediaStore.EXTRA_OUTPUT,uri);
                                startActivityForResult( openCameraIntent,ChatBottomView.FROM_CAMERA );
                            }
                        }
                        break;


今度こそうまくいくはずだ、そう、本当にうまくいくのだ、私はFileProviderパターンを書き始め、次にIntentを使ってURIを渡そうとしたが、エラーを報告し続け、どうしたらいいのかわからない。それは次のようになります。

File cameraPhoto = new File(cameraPhotoPath);
    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    Uri photoUri = FileProvider.getUriForFile(
                this,
                getPackageName() + ".provider",
                cameraPhoto);
    takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
    startActivityForResult(takePhotoIntent, REQUEST_TAKE_PHOTO);


エラーばかりで、何がなんだかわからない、恋ができない!!!!
さて、ここでマーク、誰が行に直接コードをコピーする必要があり、ストレージのアクセス許可を要求し、カメラを起動する前に、カメラのアクセス許可を呼び出すことを忘れないでください
(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA)