从presistent Uri

时间:2015-05-17 19:59:49

标签: java android image permissions

程序流程是用户从图库中选择图像并在图像视图中显示。这很好用。同时,Uri被写入数据库。

稍后,当再次运行程序或再次显示该活动时,将从数据库中检索Uri并再次显示该图像。第二次显示图像是导致异常的原因:

requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS

我向清单添加了权限,但仍然发生了异常。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />

同样的过程会尝试显示两个图像,当它来自选择器时它会起作用,但是当它来自数据库中的presistent Uri时会失败。

Picker Intent

    try {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(
                Intent.createChooser(intent, "Select Picture"),
                PICK_IMAGE);
    } catch (Exception e) {
        Toast.makeText(getApplicationContext(),
                "Error",
                Toast.LENGTH_LONG).show();
        Log.e(e.getClass().getName(), e.getMessage(), e);
    }

使用选择器意图的结果我使用

Uri selectedImageUri = data.getData();

我使用数据库读取。 localImage是一个String。

Uri.parse(localImage)

我读过这个错误报告https://issues.apache.org/jira/browse/CB-5398,但我不确定如何使用它来解决这种情况。来自另一个线程的下面的代码似乎试图用权限和照片选择器解决类似的问题,但在我的情况下我不再采摘,我只需要显示来自Uri的图像。

我想这是重置权限的问题。我不太确定。我在清单中拥有权限。也许我需要不同的代码才能显示未从选取器获得的Uri图像?也许我需要针对不同的API?我的build.gradle说targetSdkVersion 21,minSdkVersion 15.这些是默认值。我在Android Studio 1.0.2。

我很难过。任何帮助表示赞赏。

public static final String KITKAT_VALUE = 1002;

    Intent intent;

    if (Build.VERSION.SDK_INT < 19){
                            intent = new Intent();
                            intent.setAction(Intent.ACTION_GET_CONTENT);
                            intent.setType("*/*");
                            startActivityForResult(intent, KITKAT_VALUE);
                        } else {
                            intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                            intent.addCategory(Intent.CATEGORY_OPENABLE);
                            intent.setType("*/*");
                            startActivityForResult(intent, KITKAT_VALUE);
                    }

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
      if (requestCode == KITKAT_VALUE ) {
         if (resultCode == Activity.RESULT_OK) {
             // do something here
         }
      }
    }

1 个答案:

答案 0 :(得分:1)

  

同时,Uri被写入数据库。

在API级别19之前不能正常工作,然后才会使用存储访问框架(ACTION_OPEN_DOCUMENT)并获取提供的持久权限。鉴于您的现有代码,您为Uri授予的临时权限将在您的流程终止时到期。

  

我向清单添加了权限,但仍然发生了异常。

除非您使用签署固件的签名密钥签名,否则无法按住MANAGE_DOCUMENTS