×Закрыть

Андроид, как правильно получить изображение из галереи?

Думал что так правильно.

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                                intent.setType("image/*");
                                startActivityForResult(intent, 101);

Но нет.На выходе какая то странная строка.Которую в ImageView можно запихнуть один раз.А если сохранить, и еще раз пхнуть то вы ходит

I/System.out: resolveUri failed on bad bitmap uri:

Как из галереи правильно получить, место изображения в файловой системе?

👍НравитсяПонравилось0
В избранноеВ избранном0
LinkedIn

Похожие топики

Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Только не проси что-то объяснить

//
// Start Intent to catch image from gallery
//
Intent i = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, LOAD_IMAGE_REQUEST_CODE);

//
// Get Intent result here
//
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
// When an Image is picked
if (requestCode == LOAD_IMAGE_REQUEST_CODE
&& resultCode == Activity.RESULT_OK && null != data) {
// Get the Image from data
Uri selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
// Get the cursor
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null,
null);
// Move to first row
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
// Get file path to decode
String imageFilePath = cursor.getString(columnIndex);
cursor.close();

// Got your Bitmap here
Bitmap bitmap = decodeSampledBitmapFromFile(imageFilePath, 100, 100);
} else {
Toast.makeText(this, „Cant catch image. Who knows why”, Toast.LENGTH_LONG).show();
}

} catch (Exception e) {
Log.e(TAG, „Got some exception: ” + e.toString());
}
}

//
// Bitmap resize
//
public static Bitmap decodeSampledBitmapFromFile(String path,
int reqWidth, int reqHeight) { // BEST QUALITY MATCH

// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);

// Calculate inSampleSize
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
options.inPreferredConfig = Bitmap.Config.RGB_565;
int inSampleSize = 1;

if (height > reqHeight) {
inSampleSize = Math.round((float) height / (float) reqHeight);
}

int expectedWidth = width / inSampleSize;

if (expectedWidth > reqWidth) {
//if(Math.round((float)width / (float)reqWidth) > inSampleSize) // If bigger SampSize..
inSampleSize = Math.round((float) width / (float) reqWidth);
}

options.inSampleSize = inSampleSize;

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;

return BitmapFactory.decodeFile(path, options);
}

Не надо получать путь из Uri, заменить на работу с InputStream:
BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage))

ну да немного _говнокод_ оверинжениринг =)

И таки действительно, проще всего абстрактный битмап из Uri записать в реальный файл.Странная вообще хрень этот андроид.Из за каких то перемудренных ООП приколов, приходится доп память занимать.

Насчет рабочих примеров, на stackoverflow.Вот это

public String getRealPathFromURI(Context context, Uri contentUri) {
  Cursor cursor = null;
  try { 
    String[] proj = { MediaStore.Images.Media.DATA };
    cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
  } finally {
    if (cursor != null) {
      cursor.close();
    }
  }
}
возращяет пустую строку.Может ли это быть из за того, что для отладки я использую genymotion ?

вероятно, это невозможно, предлагаю бросить данную затею

используй это github.com/...​841/image-chooser-library
или исходники посмотри

Я бы не тащил в проект библиотеку на которую уже года два как забили, и где куча issues об ошибках.
github.com/...​page=2&q=is:issue is:open

А в исходниках мне лично непонятно зачем нарушается абстракция Uri для обработки отдельных провайдеров отдельными методами, если все сводится к использованию ContentResolver’a.
Особенно последний if-case крутой — uri проверяется на пять известных ему provider authorities + одно последнее условие:

|| filePath.startsWith("content://«)

В теле if блока вызывается:

ChosenImage image = processGooglePhotosMediaNew(filePath, «.jpg»);
images.addImage(image);

Где метод просто использует ContentResolver для чтения ресурса.

Я бы не назвал такой код хорошим.

Так кто то может обьяснить что это

dat=content://com.android.providers.media.documents/document/image:19

за хрень? И как её преобразовать в путь к файлу ? На stackoverflow рабочих примеров нету(((

Эта хрень — content uri, вероятнее всего сгенерированный FileProvider’ом.
А на stackoverflow примеров валом. Рабочих. Правда именно в путь к файлу преобразовывать я бы не советовал, потому что нет никаких гарантий что будет всегда работать. Например, это может быть не файл в файловой системе или, возможно, на ресурс вам будут выделены только временные разрешения.
Поэтому используйте ContentResolver и openInputStream, а дальше уже в зависимости от задач приложения.

Так то и дело в том что нужен файл, который потом будет передан на хранение,на PC в составе документа,через TCP...

Ну прекрасно, значит создайте этот файл сами и перепишите в него информацию из InputStream, который получите из openInputStream(uri).

Какое то излишнее усложнение.Мне нужны файлы сделанные исключительной камерой аппарата.

Я же вам говорю, Uniform RESOURCE identifier не обязан указывать на файл, камера может вовсе не создавать никаких файлов, а предоставлять вам доступ к временному ресурсу, сохранить который — уже ваша обязанность.

Так какую активити ты все таки «вызываешь\пользуешь» для получения ресалта галерею или камеру?
Если «камеру» то после того как кадр снят и возвращает тебе результат, он сохраняет его в темп, не все апараты персистят эту фоточку.
У тебя логика по составлению некого документа который так или иначе не может жить без твоей фотки, так сохрани ее как рекомендует Ярослав.

Которую в ImageView можно запихнуть один раз

И как же ты ее запихнул?
imageView.setImageURI(какая то странная строка); — так?

imageView.setImageURI(Uri.parse(странная строка));

Ok.
developer.android.com/...​ence/android/net/Uri.html

Immutable URI reference.
А если сохранить, и еще раз пхнуть то выходит...

Либо ты "не правильно сохраняешь«\извлекаешь сохраненную строку, либо твой ресурс куда то «испарился»
Посмотри вот эти примеры
stackoverflow.com/...​om-gallery-into-imageview

какая то странная строка.

Почитайте про uri

Плохо думал )) ...

Подписаться на комментарии