Я создаю приложение блокнота, где пользователь может добавлять изображения в свои заметки.Когда он создает новую заметку, он может выбрать несколько изображений, и они сразу же отображаются без каких-либо проблем в виде сетки в той активности, которая находится внутри новой заметки.Однако проблема приходит после.Когда он сохраняет новую заметку, 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;
}