2017-01-19 10 views
0

ギャラリーから画像を選択してパスを保存します。このパスを使って画像をRecyclerViewに表示します。私はPicassoを使って画像をImageViewにダウンロードします。私が持っている問題は、以下の通りである。許可メディア文書の拒否プロバイダ

私は画像が正しくRecyclerViewに示されているが、私は、画面を離れて戻ってきた場合、私はこのエラーを取得選択した場合:

1月19日午前15時05分に: 18.984 542-840 /? W/ActivityManager:許可の拒否:プロバイダcom.android.providers.media.MediaDocumentsProviderを開くには、android.permission.MANAGE_DOCUMENTSまたはandroid.permission.MANAGE_DOCUMENTSが必要です。

イメージは表示されません。これは私のコードです:

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


AlertDialog.Builder builder = new AlertDialog.Builder(getMainActivity()); 
    builder.setTitle("Choose Image Source"); 
    builder.setItems(new CharSequence[] {"Gallery"}, 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        switch (which) { 
          Intent intent; 
          // GET IMAGE FROM THE GALLERY 
          intent = new Intent(Intent.ACTION_GET_CONTENT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
          intent.setType("image/*"); 
          intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); // Show local files only (available since honeycomb, sdkVersion 11) 

          startActivityForResult(Intent.createChooser(intent, "Choose a picture"), Constants.REQUEST_CHOOSE_PHOTO); 
       } 
      }); 

    builder.show(); 


@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    ImageDb image = new ImageDb(); 
    if (resultCode == Activity.RESULT_OK) { 
     switch (requestCode) { 
      case Constants.REQUEST_CHOOSE_PHOTO: 
       image.setImageFilePath(data.getData().toString()); 

       break; 
     } 
     images.add(image); 
    } 
} 


@BindingAdapter({"url", "size"}) 
public static void loadImage(ImageView imageView, String url, float size) { 
    if (!Strings.isNullOrEmpty(url)) { 
     Picasso.with(imageView.getContext()).load(url).resize((int) size, (int) size).centerCrop().into(imageView); 
    } 
} 

どこに問題があるのか​​知っていますか?ありがとうございます!

答えて

2

I want to choose a picture from the gallery and then save the path

これはうまくいきません。 ACTION_GET_CONTENTを使用すると、you have temporary rights to use the Uri that you get back

また、ACTION_GET_CONTENTは、IntentではUriになりません。 android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URIを取り除く。

Does someone know where is the problem?

Uriあなたは後で取り返します。 Uriを受け取るインスタンスコンポーネント(この場合はアクティビティ)には、それを使用する権利がありますが、あなたのアプリには何もありません。

場合によっては、アクセス権を他のコンポーネントインスタンスに伝播できます。たとえば、アクティビティAに質問のコードがあり、そこにstartActivity()を呼び出してアクティビティBを開始すると、アクティビティBはデフォルトでUriで識別されるコンテンツにアクセスできなくなります。しかし、活動Aは、それがstartActivity()で使用IntentFLAG_GRANT_READ_URI_PERMISSIONフラグを追加し、一緒に渡すことができ活動B.へのアクセス

を読んしかし、ナビゲーション(例えば、BACKボタン)の他の形態は、これを提供し、ましてや持続しません。 Uriを文字列として使用し、明日または来週にそれを使用しようとしています。

Android 4.4以降でACTION_OPEN_DOCUMENTに切り替えると、takePersistableUriPermission()ContentResolverに設定すると、そのコンテンツに永続的にアクセスすることができます。

コンテンツに長期間アクセスする場合は、コンテンツ(たとえば、画像をコピーするなど)を自分が管理するストレージにコピーする必要があります(例:internal storage)。

関連する問題