2016-08-08 183 views
0

尝试显示URI时出现以下异常。我认为这发生在我的活动停止后,我尝试再次访问可行的URI。还有其他问题可以解决这个问题,但我很困惑如何将任何解决方案应用到我的代码中,因为我的takePhotoIntent允许从图库中获取或从图库中选择图片(在下面找到)。权限拒绝:MediaDocumentsProvider

Unable to open content: content://com.android.providers.media.documents/document/image%3A49688 
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaDocumentsProvider uri 
content://com.android.providers.media.documents/document/image%3A49688 from pid=821, uid=10238 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission() 

我createImageFile和我takePhotoIntent:

private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp; 
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
    File image = File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 

    // Save a file: path for use with ACTION_VIEW intents 
    mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
    return image; 
} 

private void dispatchTakePictureIntent() { 
    for(int i = 0; i < 4; i++) { 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
      // Create the File where the photo should go 
      File photoFile = null; 
      try { 
       photoFile = createImageFile(); 
       outputFileUri = Uri.fromFile(photoFile); 
      } catch (IOException ex) { 
       Log.w("error","IOException"); 
      }catch (NullPointerException nullEx) { 
       Log.w("error","NullPointerException"); 
      } 
      // Camera. 
      final List<Intent> cameraIntents = new ArrayList<Intent>(); 
      final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      final PackageManager packageManager = getPackageManager(); 
      final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0); 
      for (ResolveInfo res : listCam) { 
       final String packageName = res.activityInfo.packageName; 
       final Intent intent = new Intent(captureIntent); 
       intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); 
       intent.setPackage(packageName); 
       intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
       cameraIntents.add(intent); 
      } 
      // Filesystem. 
      final Intent galleryIntent = new Intent(); 
      galleryIntent.setType("image/*"); 
      galleryIntent.setAction(Intent.ACTION_GET_CONTENT); 
      // Chooser of filesystem options. 
      final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source"); 
      // Add the camera options. 
      chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()])); 
      if(id.equals(HAPPY_ID)) 
       startActivityForResult(chooserIntent, REQUEST_HAPPY_PHOTO); 
      if(id.equals(SURPRISED_ID)) 
       startActivityForResult(chooserIntent, REQUEST_SURPRISED_PHOTO); 
      if(id.equals(AFRAID_ID)) 
       startActivityForResult(chooserIntent, REQUEST_AFRAID_PHOTO); 
      if(id.equals(UPSET_ID)) 
       startActivityForResult(chooserIntent, REQUEST_UPSET_PHOTO); 
      if(id.equals(SAD_ID)) 
       startActivityForResult(chooserIntent, REQUEST_SAD_PHOTO); 
     } 
    } 
} 

回答

1

Storage Access Framework client documentation

  • 使用ACTION_GET_CONTENT如果你希望你的应用程序只需读取/导入数据。采用这种方法,应用程序会导入数据的副本,如图像文件。

  • 如果您希望您的应用对文档提供商拥有的文档具有长期持续访问权限,请使用ACTION_OPEN_DOCUMENT。一个例子就是一个照片编辑应用程序,它允许用户编辑存储在文档提供程序中的图像。

当您使用ACTION_GET_CONTENT,当组件被销毁(除非你通过开放的一个新组件)您的URI访问结束。如果您想要在组件的整个生命周期内继续访问该文件,或者切换到ACTION_OPEN_DOCUMENTpersist permissions(可能只有文档Uris),则必须从Uri复制该文件。

+0

谢谢!这应该在文档中提到。 – yuku

+0

@yuku - 我的答案的一半是字面上引用文档 – ianhanniballake

+0

它在另一个页面中提到:https://developer.android.com/guide/topics/providers/content-provider-basics.html#Intents 我didn'没有看到。谢谢! – yuku