Nougat: ошибка при обрезке изображения и отображении в ImageView?

Я столкнулся с приведенной ниже ошибкой в ​​случае версии Android Nougat после захвата изображения и отображения в представлении изображения, но оно работает в зефире. Я создал путь Fileprovider, который требуется для нуга.

ниже код для камеры и обрезки.

camera.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialogBuilder.dismiss();
                    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                   /* File file = new File(Environment.getExternalStorageDirectory() + File.separator + "img.jpg");
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
                    startActivityForResult(intent, 100);*/
                    file = new File(UploadIdActivtiy.this.getExternalCacheDir(),
                            String.valueOf(System.currentTimeMillis()) + ".jpg");
                    if (Build.VERSION.SDK_INT >= 24) {
                        uri = FileProvider.getUriForFile(UploadIdActivtiy.this,
                                BuildConfig.APPLICATION_ID + ".provider",
                                file);
                    }else{
                        uri = Uri.fromFile(file);
                    }
                     Log.d("camerapath==", uri.getPath());
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                    startActivityForResult(intent, 100);
                }
            });

//обрезка захваченного изображения

private void performCrop() {
        try {
            UploadIdActivtiy.this.grantUriPermission("com.activatic.paychek",uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);


            UploadIdActivtiy.this.revokeUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);

            Intent cropIntent = new Intent("com.android.camera.action.CROP");
            //indicate image type and Uri
            cropIntent.setDataAndType(uri, "image/*");

            cropIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            cropIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            //set crop properties
            cropIntent.putExtra("crop", "true");
            //indicate aspect of desired crop
            cropIntent.putExtra("aspectX", 1);
            cropIntent.putExtra("aspectY", 1);
            //indicate output X and Y
            cropIntent.putExtra("outputX", 256);
            cropIntent.putExtra("outputY", 256);

            cropIntent.putExtra("outputFormat", "JPEG");
            cropIntent.putExtra("noFaceDetection", true);
            //retrieve data on return
            cropIntent.putExtra("return-data", true);

            if (Build.VERSION.SDK_INT >= 24) {

                uri = FileProvider.getUriForFile(UploadIdActivtiy.this,
                        BuildConfig.APPLICATION_ID + ".provider", createCropFile());

            } else
                uri = Uri.fromFile(createCropFile());
            //start the activity - we handle returning in onActivityResult
            cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            startActivityForResult(cropIntent, PIC_CROP);
        } catch (ActivityNotFoundException anfe) {
            //display an error message
            String errorMessage = "Whoops - your device doesn't support the crop action!";
            Toast toast = Toast.makeText(getApplicationContext(), errorMessage, Toast.LENGTH_SHORT);
            toast.show();
        }
    }

//функция создания файла обрезки

 private File createCropFile() {
        File storageDir = UploadIdActivtiy.this.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        //  path = path + (timeStamp + "1jpg");

        try {
            file = File.createTempFile(timeStamp, ".jpg", storageDir);
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (Build.VERSION.SDK_INT >= 24)
            mCurrentPhotoPath = String.valueOf(FileProvider.getUriForFile(UploadIdActivtiy.this,
                    BuildConfig.APPLICATION_ID + ".provider", file));
        else
            mCurrentPhotoPath = String.valueOf(Uri.fromFile(file));
        return file;
    }

//Результат активности

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == -1) {

            if (requestCode == 100 ) {
                Log.e("Exception 100","resultCode >> "+resultCode);
                File file = new File(Environment.getExternalStorageDirectory()+File.separator + "img.jpg");

                Log.d("showimgfile","==="+file);
                Log.d("shosimg","%%=="+Uri.fromFile(file));


                try{
                    Log.d("shosimg","%%=="+file);
                    Log.d("shosimg","%%=="+Uri.fromFile(file));

                    //ImageCropFunction(Uri.fromFile(file));
//                    uri = data.getData();
                    performCrop();
                }catch (ActivityNotFoundException aNEF){
                    String errorMessage = "Sorry - your device doesn't support the crop action!";
                    Toast toast = Toast.makeText(getApplicationContext(), errorMessage, Toast.LENGTH_SHORT);
                    toast.show();
                }
            }

            else if (requestCode == 10) {
                Log.d("Exception 10", "resultCode >> " + resultCode);

                uri = data.getData();
                performCrop();
            }
            else if(requestCode == PIC_CROP){
                Log.d("imavalue==",""+img);
                if(img==200)
                {
                    Bundle extras = data.getExtras();
                    thePic_imgone = extras.getParcelable("data");

                    CheckCount_imgone = 1;
                    BitmapDrawable background = new BitmapDrawable(thePic_imgone);
                    llFront.setBackgroundDrawable(background);

                    iv_front.setVisibility(View.GONE);
                    txt_front.setVisibility(View.GONE);
                    //iv_front.setImageBitmap(thePic_imgone);

                }

                if(img==300)
                {
                    Bundle extras = data.getExtras();
                    thePic_imgtwo = extras.getParcelable("data");

                    CheckCount_imgtwo = 2;
                    BitmapDrawable background = new BitmapDrawable(thePic_imgtwo);
                    llBack.setBackgroundDrawable(background);

                    ivbackimage.setVisibility(View.GONE);
                    txt_back.setVisibility(View.GONE);
                    //ivbackimage.setImageBitmap(thePic_imgtwo);

                }
            }

        }else{
            Log.e("Exception", "resultCode >> " + resultCode);
        }
    }

// ошибка, с которой я сталкиваюсь

   java.lang.SecurityException: Permission Denial: writing android.support.v4.content.FileProvider uri content://com.activatic.paychek.provider/external_files/Android/data/com.activatic.paychek/files/Pictures/20180323_103545290646785.jpg from pid=16668, uid=10046 requires the provider be exported, or grantUriPermission()
                                                                          at android.content.ContentProvider.enforceWritePermissionInner(ContentProvider.java:682)
                                                                          at android.content.ContentProvider$Transport.enforceWritePermission(ContentProvider.java:497)
                                                                          at android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:469)
                                                                          at android.content.ContentProvider$Transport.openAssetFile(ContentProvider.java:384)
                                                                          at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:262)
                                                                          at android.os.Binder.execTransact(Binder.java:565)

person Sunil P    schedule 23.03.2018    source источник
comment
попробуйте stackoverflow.com/questions/39787129/   -  person sak    schedule 23.03.2018
comment
это не помогло @sak   -  person Sunil P    schedule 23.03.2018
comment
ребят, я так и не решил. Пожалуйста, помогите с тем же.   -  person Sunil P    schedule 23.03.2018
comment
все еще сталкивается с проблемой?   -  person sak    schedule 26.03.2018


Ответы (1)


Вы добавили в свой манифест? просто добавьте это в свой файл манифеста

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

и ваш provider_path.xmlбудет таким же, как

<?xml version="1.0" encoding="utf-8"?><paths xmlns:android="http://schemas.android.com/apk/res/android">

person Mohammad Arman    schedule 23.03.2018
comment
да, я добавил выше, но где вы хотите, чтобы я добавил эту строку <paths xmlns:android="http://schemas.android.com/apk/res/android"> - person Sunil P; 23.03.2018
comment
Он будет в вашей папке xml в каталоге res. - person Mohammad Arman; 23.03.2018
comment
да там все что я добавил - person Sunil P; 23.03.2018
comment
Просто замените этот android:exported=true tools:replace=exported и протестируйте его. - person Mohammad Arman; 23.03.2018
comment
после добавления tools:replace="exported" выдается ошибка, говорящая, что префикс tools:replace, связанный с поставщиком типа элемента, не привязан - person Sunil P; 23.03.2018
comment
Хорошо, пусть это будет использоваться в вашем createCrope() if(Build.VERSION.SDK_INT›=24){ try{ Method m = StrictMode.class.getMethod(disableDeathOnFileUriExposure); m.invoke (ноль); }catch(Exception e){ e.printStackTrace(); } } - person Mohammad Arman; 23.03.2018
comment
Давайте продолжим обсуждение в чате. - person Sunil P; 23.03.2018
comment
может быть, это поможет вам stackoverflow.com/questions/24467696 / - person Mohammad Arman; 23.03.2018