Android получает миниатюру Uri после получения изображения с камеры

Я не хочу использовать какой-либо код изменения размера растрового изображения, если я могу помочь. У меня есть способ получить MINI миниатюру uri, когда я получаю изображения из галереи, но когда я пытаюсь сделать то же самое с камерой, это не работает:

Вот методы:

private Uri getParsedUri(Uri selectedImageUri) {
    Uri parsed = null;
    try {
        String uri = getThumbnailPath(selectedImageUri);

        if (uri != null) {
            Timber.d("Thumb uri found %s", uri);
            File file = new File(uri);
            parsed = Uri.fromFile(file);
            Timber.d("thumb uri parsed : %s", parsed);
        } else {
            Timber.d("Thumb uri not found, using :  %s", selectedImageUri);
        }
    } catch (Exception e){
        Timber.e(e, "Error getting mini uri");
    }
    return parsed;
}

private String getThumbnailPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media._ID };
    String result = null;
    Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
    if (cursor != null && cursor.getCount() > 0) {
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media._ID);

        cursor.moveToFirst();
        long imageId = cursor.getLong(column_index);
        cursor.close();

        Cursor cursor2 = MediaStore.Images.Thumbnails.queryMiniThumbnail(
                getContentResolver(), imageId,
                MediaStore.Images.Thumbnails.MINI_KIND,
                null);
        if (cursor2 != null && cursor2.getCount() > 0) {
            cursor2.moveToFirst();
            result = cursor2.getString(cursor2.getColumnIndexOrThrow(MediaStore.Images.Thumbnails
                    .DATA));
            cursor2.close();
        }
    }
    return result; //always null for pictures from the Camera
}

Вот как я предоставляю дополнительный uri для приложения «Камера»:

private void onTakePhotoFromCameraClick() {
    final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//        takePicUri = Uri.fromFile(getTempFile(ProductNewActivity.this));
    takePicUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            new ContentValues());
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
            takePicUri);
    startActivityForResult(intent, OPTION_TAKE_PHOTO_FROM_CAMERA);
}


private File getTempFile(Context context) {
     final File path = new  File(Environment.getExternalStorageDirectory(),
            context.getPackageName());
    if (!path.exists()) {
        path.mkdir();
    }
    long millis = new Date().getTime();
    String name_file = String.valueOf(millis);
    File tempImageFile = new File(path, "MyImage_" + name_file + ".tmp");
    return tempImageFile;
}

оба метода получения Uri (используя распознаватель контента или создавая собственный Uri, не работают, и я никогда не могу получить миниатюру. Есть ли способ указать системе для создания миниатюры? Всегда ли генерируется миниатюра ?.

Редактировать: я думаю, что не ясно объяснил. Мне нужно 2 Uri: один для большого изображения и один для миниатюры. Мне не нужны растровые изображения. Я использую Universal Image Loader для отображения изображений, поэтому мне не нужно маленькое растровое изображение. Я сам создаю Uri для большого изображения, но я хотел бы найти способ для Android создать миниатюру, поскольку он уже делает это для изображений галереи.


person vallllll    schedule 10.06.2015    source источник
comment
Зачем голосовать против? Не могли бы вы объяснить, почему вы проголосовали против, чтобы я мог исправить то, что не так?   -  person vallllll    schedule 10.06.2015


Ответы (2)


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

final int TAKE_PHOTO_REQ = 100;
    String file_path = Environment.getExternalStorageDirectory()
            + "/recent.jpg";
    file = new File(file_path);
public void takePic(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, TAKE_PHOTO_REQUEST_FRAG);
}
@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
        case TAKE_PHOTO_REQ: {
            if (resultCode == TakePicture.RESULT_OK && data != null) {

                Bitmap myBmp = (Bitmap) data.getExtras().get("data");



                imageView.setImageBitmap(myBmp);
                ByteArrayOutputStream bytes = new ByteArrayOutputStream();

                // you can create a new file name "recent.jpg" in sdcard folder.
                File f = new File(file_path);
                try {
                    f.createNewFile();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                // write the bytes in file
                FileOutputStream fo = null;
                try {
                    fo = new FileOutputStream(f);
                } catch (FileNotFoundException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                try {
                    fo.write(bytes.toByteArray());
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                // remember close de FileOutput
                try {
                    fo.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Log.e("take-img", "Image Saved to sd card...");

                break;
            }
        }
        }
    }

Надеюсь, что это поможет вам.

person sahu    schedule 10.06.2015
comment
Я не хочу растровое изображение, мне нужен Uri для небольших изображений. - person vallllll; 10.06.2015
comment
Попробуйте получить uri из самого пути. @vallllll - person sahu; 10.06.2015
comment
Да, но он создает дополнительный файл и дополнительное растровое изображение, которое мне не нужно. Мне было интересно, есть ли способ получить миниатюру, которую Android создает по умолчанию. - person vallllll; 10.06.2015

Если вас интересует только миниатюра, начните намерение следующим образом:

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, TAKE_THUMB );

Затем в OnActivityResult вы можете извлечь большой палец из намерения, например:

Bundle extras = data.getExtras();
Bitmap bitmap = (Bitmap) extras.get("data");
imageView1.setImageBitmap(bitmap);
person greenapps    schedule 10.06.2015
comment
Спасибо, но на Samsung Galaxu S5 я получаю ноль дополнительных - person vallllll; 10.06.2015