2017-10-17 101 views
1

我的应用程序允许用户查看图库或其他位置中的某些选定图像。我请求通过URI的图像:重新启动后图库中的图像权限丢失

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); 
photoPickerIntent.setType("image/*"); 
startActivityForResult(photoPickerIntent, PickerFragment.PICK_PHOTO); 

然后得到URI在onActivityResult(INT requestCode,INT resultCode为,意图数据),并有机会获得这些图像把它们放在我的应用程序的意见通过:

Uri imageUri= data.getData(); 

当应用程序完成后,我保存所有的URI在我的数据库通过字符串:

String imageUriString = imageUri.toString(); 
saveToDB (imageUriString); 

然而,当我重新启动应用程序,并从我的DAT恢复所有的URI通过:

String imageUriString = restoreFromDB(); 
imageUri = Uri.parse (imageUriString); 

该应用程序没有权限的那些Uri的在Android 7.1中。 我通过访问图片:

ContentResolver cr = mContext.getContentResolver(); 
InputStream is = cr.openInputStream(imageUri); 
BitmapFactory.decodeStream(is, null, o); 

但收到此异常:

java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.contentprovider.impl.MediaContentProvider from ProcessRecord 

有一种优雅的和合法的方式来保持该权限? 我试图阅读关于权限的所有文档,但感觉真的很困惑。

如果你让我正确的学习方向,将不胜感激。

PS Uri的权限持续时,将图像复制到应用程序内存是一种选择,但我想避免这种情况。至少看看是否有可能。

PPS我已授予所有权限,例如相机和外部存储器写入和读取。

+0

检查时图像不存在此链接https://stackoverflow.com/questions/37409181/java-lang-securityexception-permission-denial-opening-provider – Anonymous

+0

店字节组而不是uri.Uri失败在画廊。 – Anonymous

+0

@匿名,存储是一个选项,但不是理想的。在我的情况下,即使图像存在于图库中,Uri也会失败 – rommex

回答

1

所以,在@greenapps的重要帮助和测试之后荷兰国际集团在模拟器和实际设备,该解决方案是这样的:

  • 使用的另一种意图:

    意图photoPickerIntent =新意图(Intent.ACTION_OPEN_DOCUMENT);

  • 在onActivityResult

    ()固定为URI中的持久化权限,这将是应用程序的重新发布后完好无损:

    乌里selectedImage = data.getData();

    if(Build.VERSION.SDK_INT> Build.VERSION_CODES。JELLY_BEAN_MR2)getContentResolver()。takePersistableUriPermission(selectedImage,Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); }

0

是指回答here

打开使用对话框下面的代码:

ActivityCompat.requestPermissions(MainActivity.this, 
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
        1); 

获得如下的活动结果:

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case 1: { 

      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // contacts-related task you need to do.   
      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
       Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show(); 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 

更多信息:https://developer.android.com/training/permissions/requesting.html

+0

我已授予所有权限,例如相机和外部存储器的写入和读取。我的问题是关于另一个问题。 – rommex

+0

那么在答案中使用的代码是肯定的? –

+0

问题是关于文件Uri权限,而不是一般运行时权限。 – rommex