Я новичок в android и кодировании, и я застрял здесь. У меня есть gridview, который показывает изображения с моей SDCard. но моя сетка ничего не показывает. Мой Uri выглядит следующим образом:
[content://com.android.providers.media.documents/document/image%3A252,content://com.android.providers.media.documents/document/image%3A68,content://com.android.providers.media.documents/document/image%3A67,content://com.android.providers.media.documents/document/image%3A172]
Я пробовал много способов преобразовать этот URI в реальный путь, но у меня ничего не работает
Я пробовал этот код, но он приводит к cra sh мое приложение:
public String getRealPathFromURI (Uri contentUri) {
String path = null;
String[] proj = { MediaStore.MediaColumns.DATA };
Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
if (cursor.moveToFirst()) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
path = cursor.getString(column_index);
}
cursor.close();
return path;
}
снимок экрана
вот как я открываю галерею:
btnGallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setType("image/*");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
}
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_IMAGE);
}
});
Этот код метода onActivityResult ():
if (requestCode == PICK_IMAGE_MULTIPLE && resultCode == RESULT_OK && null != data) {
// Get the Image from data
String[] filePathColumn = {MediaStore.Images.Media.DATA};
imagesEncodedList = new ArrayList<String>();
if (data.getData() != null) {
Uri mImageUri = data.getData();
// Get the cursor
Cursor cursor = getContentResolver().query(mImageUri, filePathColumn, null, null, null);
// Move to first row
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imageEncoded = cursor.getString(columnIndex);
cursor.close();
ArrayList<Uri> mArrayUri = new ArrayList<Uri>();
mArrayUri.add(mImageUri);
uriImage = mArrayUri.toString();// this string i store in sqlite
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);
} else {
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);
uriImage = mArrayUri.toString();//this string store in sqlite
// 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);
}
Log.v("LOG_TAG", "Selected Images" + mArrayUri.size());
}
}
} else if (resultCode == this.RESULT_CANCELED) {
Toast.makeText(this, "Cancelled", Toast.LENGTH_SHORT).show();
}
вот как я получаю строку из sqlite в Adapterclass:
final String image_string = product.getFimage();//get string from sqlite
и отправляю, чтобы поделиться предпочтениями:
SharedPreferences settings = mCtx.getSharedPreferences("image_My_str", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putString("img_str", image_string);
editor.commit();
В моем отображении я получаю эта строка из общего предпочтения:
SharedPreferences settings = getSharedPreferences("image_My_str", Context.MODE_PRIVATE);
String encodedImage = settings.getString("img_str", "");
и здесь я преобразовываю эту строку в URi:
Uri mImageUri = Uri.parse(encodedImage);
Log.d("LOG_TAG", "Images URI " + mImageUri);
try {
inputStream = getApplicationContext().getContentResolver().openInputStream(mImageUri);
Log.d("LOG_TAG", "Images File " + inputStream);
bitmap = BitmapFactory.decodeStream(inputStream);
Log.d("LOG_TAG", "Images bitmap " + bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
if (bitmap != null) {
img.setImageBitmap(bitmap);
}else {
Toast.makeText(EditMapsActivity.this, "image not found", Toast.LENGTH_LONG).show();
}
Мой URI выглядит так:
[content://com.android.providers.media.documents/document/image%3A252,content://com.android.providers.media.documents/document/image%3A68,content://com.android.providers.media.documents/document/image%3A67,content://com.android.providers.media.documents/document/image%3A172]