1

好的一天。我有一個奇怪的問題,其中沒有任何示例在堆棧溢出工作。我打開一個畫廊,之後我重定向用戶裁剪intent.Important要提及的是,這隻發生在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); 

茲授予開放的權限,已經添加了這些體現

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

我已經嘗試了所有堆在流動答案的例子,對堆棧溢出沒有更多的問題與此方案並沒有任何他們已經work.So什麼是與Android 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

一分鐘病後 –

+0

這是授予SD讀/寫權限的不正確方法,請參閱[此鏈接](https://developer.android.com/training/permissions/requesting.html) – Gattsu

回答

0

首先,Android不具有CROPIntent例外。有many image cropping libraries available for Android。使用一個。

其次,grantUriPermissions()的第一個參數不是一個動作字符串或一些隨機系列的字符。它是一個應用程序ID(a.k.a.,包名)。 com.android.camera.action.CROP不是包名稱。

+0

錯...... Android有默認的裁剪意圖,可以通過它的應用程序ID(aka包名稱)進行訪問,因此,假定android可以處理給定包名和處理程序類中的intent,授予URI權限需要字符串,這意味着我必須授予URI權限和URI可以是一系列字符。 –

+0

@fasfsafsaf:「Android有默認的裁剪意圖」 - [不,]沒有(https://commonsware.com/blog/2013/01/23/no-android-does-not-have-crop-intent的.html)。 – CommonsWare

+0

遵循使用第三方圖像裁剪庫的建議花費了我大約4個小時,只是發現它們都沒有正確處理使用FileProvider的Uri。我從來沒有使用過'com.android.camera.action.CROP'的問題,所以我覺得你的警告可能被誇大了。 Tong Tracy的答案確實奏效。 – 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文件」,那麼你必須允許系統照片。如果你不知道這個包名,你可以通過所有的包名。 –