簡體   English   中英

從持久性Uri加載圖像時出錯

[英]Error loading image from presistent Uri

程序流程是用戶從圖庫中選擇一個圖像,並在圖像視圖中顯示該圖像。 這很好。 同時,將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" />

相同的過程嘗試同時顯示兩個圖像,當它來自選擇器時可以工作,但是當它來自數據庫中的持久Uri時失敗。

選擇器意圖

    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是一個字符串。

Uri.parse(localImage)

我閱讀了此錯誤報告https://issues.apache.org/jira/browse/CB-5398 ,但是我不確定如何使用它來解決這種情況。 下面來自另一個線程的代碼似乎試圖解決權限和照片選擇器的類似問題,但就我而言,我不再選擇,我只需要顯示Uri中的圖像即可。

我想這是重置權限的問題。 我不太確定 我有清單中的權限。 也許我需要不同的代碼來顯示未從選擇器獲得的Uri圖像? 也許我需要針對其他API? 我的build.gradle表示targetSdkVersion 21,minSdkVersion15。這些是默認設置。 我在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
         }
      }
    }

同時,將Uri寫入數據庫。

只有在您使用存儲訪問框架( ACTION_OPEN_DOCUMENT )並獲取提供的持久權限時,API級別19之前的版本才能使用。 給定您現有的代碼,為此Uri授予的臨時權限最遲將在過程終止時到期。

我向清單添加了權限,但仍然發生異常。

您不能持有MANAGE_DOCUMENTS ,除非您通過對固件進行簽名的簽名密鑰進行了簽名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM