Android - Get URI from Picture that i just have taken (without save the image again)

Refresh

December 2018

Views

3k time

3

I've found a lot of answers for questions like mine but they doesn't make sense for me. Let me explain.

I have a ImageButton that let the user take a picture and display it on interface. When i try to get image URI, it returns null:

Uri uri = data.getData(); 

I've made some searches on internet and found solutions like:

@Override
public void onActivityResult(int requestCode, int resultCode,
        Intent data) {
    try {
        if (resultCode == Activity.RESULT_OK) {
            updateProfilePicure = Boolean.TRUE;
            switch(requestCode){
                case 0:
                    Bundle extras = data.getExtras();
                    Object xx = data.getData();
                    Bitmap imageBitmap = (Bitmap) extras.get("data");
                    Uri tempUri = getImageUri(imageBitmap);
                    imageView.setImageBitmap(imageBitmap);
                    break;
                default: break;
            }
        }
    } catch(Exception e){
        e.printStackTrace();
    }
}

public Uri getImageUri(Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(
            ApplicationContext.getInstance().getContext().getContentResolver(), inImage,
   "Title", null);
    return Uri.parse(path);
}   

For me, it doesn't make sense because when the call goes to method onActivityResult(), the picture is already saved on DCIM folder and don't have any reason to save it again. So why should i use it?

Is possible to find another way to retrieve the URI from captured image?

Thank's in advance.

2 answers

5

картина уже сохранена в папке DCIM и не имеет никаких оснований, чтобы сохранить его снова.

Не обязательно. Цитирование в документацииACTION_IMAGE_CAPTURE :

Вызывающий абонент может пройти дополнительный EXTRA_OUTPUT контролировать, где этот образ будет записан. Если EXTRA_OUTPUT нет, то небольшой размер изображения возвращается в виде объекта Bitmap в дополнительном поле.

( «лишние поля» здесь является дополнительным ключом , как data)

Фрагмент кода , который вы вставили в извлечении dataдополнительной, и поэтому изображение не хранится.

Есть возможность найти другой способ извлечения URI из захваченного изображения?

У вас уже есть код для этого, в первом фрагменте кода - если вы указав , Uriкак EXTRA_OUTPUTв вашем ACTION_IMAGE_CAPTUREзапросе, вы получите Uriобратно к изображению , которое было принято в Intentвручаются onActivityResult().

2

Посмотрите на эту ссылку: http://developer.android.com/training/camera/photobasics.html

Я много работал с изображениями на моем последнем проекте. При создании изображения с помощью что-то вроде этого:

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) 
{
    startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}

Изображение не сохраняется (по крайней мере, он не делает это в моем проекте). Вы можете получить миниатюру непосредственно с помощью этого кода:

Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");

Если вы хотите иметь полный размер, вы должны сохранить его:

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
    // Create the File where the photo should go
    File photoFile = null;
    try {
        // This is where the file is created, create it as you wish. For more information about this, see the link or add a comment
        photoFile = createImageFile();
    } catch (IOException ex) {
        // Error occurred while creating the File
        ...
    }
    // Continue only if the File was successfully created
    if (photoFile != null) {
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                Uri.fromFile(photoFile));
        startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
    }
}