получить фактический путь к нескольким изображениям из URI - PullRequest
2 голосов
/ 27 мая 2020

Я новичок в 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]
...