2017-01-19 4 views
0

Я хочу выбрать изображение из галереи, а затем сохранить путь. Я использую этот путь для отображения изображений в RecyclerView. Я использую Picasso, чтобы загрузить изображение в ImageView. У меня проблема заключается в следующем:Разрешение Отказ от средств массовой информации поставщик документов

когда я выбираю изображение правильно отображается в RecyclerView, но если оставить экран и вернуться, я получаю эту ошибку:

01-19 15:05: 18,984 542-840 /? W/ActivityManager: Разрешение: открытие провайдера com.android.providers.media.MediaDocumentsProvider from ... требует 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 не принимает Uri в Intent. Избавиться android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI.

Does someone know where is the problem?

Вы пытаетесь использовать Uri, что вы получите позже. Компонент экземпляра (в данном случае, активность), который получает Uri, имеет права его использовать, но ничего не происходит в вашем приложении.

В некоторых ситуациях вы можете распространять свои права доступа на другие экземпляры компонентов. Например, предположим, что у Activity A есть код из вашего вопроса, и там вы вызываете startActivity(), чтобы начать Activity B. Активность B не будет иметь доступ к содержимому, указанному Uri по умолчанию. Но активность может добавить FLAG_GRANT_READ_URI_PERMISSION флаг в Intent он использует с startActivity() и передать доступ на чтение к деятельности В.

Но другие формы навигации (например, кнопка НАЗАД) не предлагают это, не говоря уже о неизменном Uri как строка и пытается использовать ее завтра или на следующей неделе.

Если вы переключитесь на ACTION_OPEN_DOCUMENT на Android 4.4+, вы можете попробовать использовать takePersistableUriPermission() на ContentResolver, и в этом случае вы можете получить прочный доступ к этому контенту.

В противном случае, если вы ищете долгосрочный доступ к контенту, вам необходимо скопировать содержимое (например, скопировать изображение) в хранилище, которое вы контролируете (например, internal storage).

Смежные вопросы