Отказ в доступе к медиа-документу в Android - PullRequest
0 голосов
/ 20 ноября 2018

Я создаю приложение блокнота, где пользователь может добавлять изображения в свои заметки.Когда он создает новую заметку, он может выбрать несколько изображений, и они сразу же отображаются без каких-либо проблем в виде сетки в той активности, которая находится внутри новой заметки.Однако проблема приходит после.Когда он сохраняет новую заметку, Uris выбранных изображений сохраняются в файле XML как строки.Когда я пытаюсь просмотреть выбранную заметку, пути к изображениям из xml снова преобразуются в массив и присоединяются к представлению сетки.вот где проблема приходит.Ошибка:

Отказ в разрешении: открытие поставщика com.android.providers.media.MediaDocumentsProvider из ProcessRecord {ee1d3ac 8522: aahmf.notepad / u0a89} (pid = 8522, uid = 10089) требует, чтобы вы получили доступ с помощьюACTION_OPEN_DOCUMENT или связанные API -

код для выбора изображений для новой заметки

if (data.getClipData() != null) 
                  {
                        ClipData mClipData = data.getClipData();
                        ArrayList<Uri> mArrayUri = new ArrayList<Uri>();
                        for (int i = 0; i < mClipData.getItemCount(); i++) {

                            ClipData.Item item = mClipData.getItemAt(i);
                            Uri uri = item.getUri();
                            mArrayUri.add(uri);
                            // Get the cursor
                            Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);
                            // Move to first row
                            cursor.moveToFirst();

                            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                            imageEncoded  = cursor.getString(columnIndex);
                            imagesEncodedList.add(imageEncoded);
                            cursor.close();

                            galleryAdapter = new GalleryAdapter(getApplicationContext(),mArrayUri);
                            gvGallery.setAdapter(galleryAdapter);
                            gvGallery.setVerticalSpacing(gvGallery.getHorizontalSpacing());
                            ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) gvGallery
                                    .getLayoutParams();
                            mlp.setMargins(0, gvGallery.getHorizontalSpacing(), 0, 0);

                        }
                        ImagePaths= mArrayUri;

Код адаптера

public class GalleryAdapter extends BaseAdapter {

    private Context ctx;
    private int pos;
    private LayoutInflater inflater;
    private ImageView ivGallery;
    ArrayList<Uri> mArrayUri;
    public GalleryAdapter(Context ctx, ArrayList<Uri> mArrayUri) {

        this.ctx = ctx;
        this.mArrayUri = mArrayUri;
    }

    @Override
    public int getCount() {
        return mArrayUri.size();
    }

    @Override
    public Object getItem(int position) {
        return mArrayUri.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        pos = position;
        inflater = (LayoutInflater) ctx
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View itemView = inflater.inflate(R.layout.gv_item, parent, false);

        ivGallery = (ImageView) itemView.findViewById(R.id.ivGallery);

        ivGallery.setImageURI(mArrayUri.get(position));

        return itemView;
    }

Код создания XMl

xmlSerializer.startTag(null, "userData");
            xmlSerializer.startTag(null,"Text");
            xmlSerializer.text(NoteText);
            xmlSerializer.endTag(null, "Text");
            for(int i = 0;i<Gallery.ImagePaths.size();i++)
            {
                xmlSerializer.startTag(null,"Image"+i);
                xmlSerializer.text(Gallery.ImagePaths.get(i).toString());
                xmlSerializer.endTag(null,"Image"+i);
            }
            xmlSerializer.endTag(null, "userData");
            xmlSerializer.endDocument();
            xmlSerializer.flush();

И, наконец, преобразование путей строкового типа из xml в uri для отображения их в виде сетки

switch (eventType)
                {
                    case XmlPullParser.START_TAG:
                        for (int i = 0; i <= XmlPullParser.END_TAG; i++)
                        {
                            if (tagname.equalsIgnoreCase("Image" + i))
                            {
                                try {
                                    eventType=xpp.next();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                } catch (XmlPullParserException e) {
                                    e.printStackTrace();
                                }
                                //eventType=XmlPullParser.TEXT;
                                // if (eventType == XmlPullParser.TEXT)

                                Images.add(Uri.parse(xpp.getText()));
                                galleryAdapter = new GalleryAdapter(getApplicationContext(),Images);
                                gvGallery.setAdapter(galleryAdapter);
                                gvGallery.setVerticalSpacing(gvGallery.getHorizontalSpacing());
                                ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) gvGallery
                                        .getLayoutParams();
                                mlp.setMargins(0, gvGallery.getHorizontalSpacing(), 0, 0);
                                //}
                            }


                        }
                        break;
                }
...