1

Хороший день. У меня странная проблема, с которой ни один из примеров переполнения стека не работал. Я открываю галерею, после чего я перенаправляю пользователя на обрезку намерение. Важно отметить, что это происходит только на android N, а не на устройствах ниже. Проблема заключается в том, что это исключение выбрасывается, как только происходит урожай. Я не знаю, что вызывает это, но на самом деле вот как я начинаю уловки ,Разрешение Отказ: написание android.support.v4.content.FileProvider uri

Intent cropIntent = new Intent("com.android.camera.action.CROP"); 
    cropIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 


    Uri outPutUri = FileProvider.getUriForFile(activity, activity.getApplicationContext().getPackageName() + ".provider", new File(output)); 
    Uri photoURI = FileProvider.getUriForFile(activity, activity.getApplicationContext().getPackageName() + ".provider", new File(path)); 

    activity.grantUriPermission("com.android.camera.action.CROP", outPutUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    activity.grantUriPermission("com.android.camera.action.CROP", photoURI, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 

    cropIntent.setDataAndType(photoURI, "image/*"); 

    cropIntent.putExtra("crop", "true"); 

    cropIntent.putExtra("aspectX", aspectX); 
    cropIntent.putExtra("aspectY", aspectY); 


    cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, outPutUri); 

    activity.startActivityForResult(cropIntent, CROP_REQUEST); 

Я получил разрешение Uri, добавил они, чтобы проявить

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

Я попытался всей стопка примеров ответов потока, нет более вопроса о переполнении стека с этим сценарием и не каким-либо из них сработали. Так что с проблемой андроида N? Должно быть, это так сложно?

Это исключение, которое бросают

FATAL EXCEPTION: main 
Process: com.android.gallery3d, PID: 5735 
java.lang.SecurityException: Permission Denial: writing android.support.v4.content.FileProvider uri content://my.package.name/external_files/Android/data/my.package.name/cache/0.5062300225583558.png from pid=5735, uid=10071 requires the provider be exported, or grantUriPermission() 
at android.os.Parcel.readException(Parcel.java:1683) 
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183) 
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:146) 
at android.content.ContentProviderProxy.openAssetFile(ContentProviderNative.java:621) 
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1000) 
at android.content.ContentResolver.openOutputStream(ContentResolver.java:742) 
at android.content.ContentResolver.openOutputStream(ContentResolver.java:718) 
at com.android.gallery3d.filtershow.crop.CropActivity$BitmapIOTask.<init>(CropActivity.java:408) 
at com.android.gallery3d.filtershow.crop.CropActivity.startBitmapIO(CropActivity.java:339) 
at com.android.gallery3d.filtershow.crop.CropActivity.startFinishOutput(CropActivity.java:311) 
at com.android.gallery3d.filtershow.crop.CropActivity$1.onClick(CropActivity.java:117) 
at android.view.View.performClick(View.java:5610) 
at android.view.View$PerformClick.run(View.java:22260) 
at android.os.Handler.handleCallback(Handler.java:751) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6077) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
09-30 13:19:44.376 11909-11942/volo.global.pingbing E/FA: Task exception on worker thread: java.lang.IncompatibleClassChangeError: The method 'java.io.File android.support.v4.content.ContextCompat.getNoBackupFilesDir(android.content.Context)' was expected to be of type virtual but instead was found to be of type direct (declaration of 'com.google.firebase.iid.zzg' appears in /data/app/volo.global.pingbing-1/base.apk): com.google.android.gms.measurement.internal.zzt.zzEd(Unknown Source) 
+0

ли опубликовать ваш [LogCat] (http://www.cmstactical.net/uploads/4/8/9/1/48914725/9763380_orig.jpg) поможет нам больше, чтобы получить ваш вопрос. – Gattsu

+0

1 минута плохое сообщение –

+0

Неправильный способ предоставления разрешения на чтение и запись SD, пожалуйста, обратитесь к [этой ссылке] (https://developer.android.com/training/permissions/requesting.html) – Gattsu

ответ

0

Во-первых, Android не имеет CROPIntent. Есть many image cropping libraries available for Android. Используйте его.

Во-вторых, первый параметр, равный grantUriPermissions(), не является строкой действия или некоторой случайной серией символов. Это идентификатор приложения (a.k.a., название пакета). com.android.camera.action.CROP - нет название упаковки.

+0

неправильный ... Android имеет намерение Croping по умолчанию, к которому можно получить доступ через его идентификатор приложения (aka имя пакета), поэтому вполне справедливо предположить, что андроид может обрабатывать намерение в пределах указанного имени пакета и класса обработчика для этого намерения, во-вторых, grant uri требует String, что означает, что я должен предоставить разрешение URI, а URI может быть рядом символов. –

+0

@fasfsafsaf: «Android имеет намерение Croping по умолчанию» - [нет, это не так] (https://commonsware.com/blog/2013/01/23/no-android-does-not-have-crop-intent .html). – CommonsWare

+0

Следуя советам по использованию библиотеки обрезки изображений сторонних разработчиков, мне обошлось около 4 часов, чтобы узнать, что ни один из них не корректно обрабатывает Uri с помощью FileProvider. У меня никогда не было проблем с использованием 'com.android.camera.action.CROP', поэтому я чувствую, что ваши предупреждения против него могут быть преувеличены. Ответ Тонг Трейси действительно работает. – wvdz

0

вы должны добавить эту фразу: grantUriPermission(); как

this:grantUriPermission("com.google.android.apps.photos",cropedImageUri,Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 

Моя ошибка, как на u.I решить этим.

4
List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
     for (ResolveInfo resolveInfo : resInfoList) { 
      String packageName = resolveInfo.activityInfo.packageName; 
      grantUriPermission(packageName, photoURI, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 
     } 
+1

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. –

+1

Благодарим вас за советы. Позвольте мне объяснить причину этого кода. В Android N вы должны получить разрешение «написать или прочитать файл Uri» для обеспечения безопасности. Если вы хотите, чтобы системная фотография обрезала ваш «файл uri», вы должны разрешить системную фотографию. если вы не знаете этого имени пакета, вы можете через все имя пакета. –