захват изображений с помощью MediaStore.ACTION_IMAGE_CAPTURE в Android

Я снимаю изображения с помощью MediaStore.ACTION_IMAGE_CAPTURE. он работает нормально в большинстве устройств. но он не работает должным образом в некоторых последних устройствах Android, как ожидалось.

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

**: Когда я снимаю изображение, оно возвращает другое изображение галереи в методе onActivityResult вместо захваченного изображения на некоторых последних устройствах Android. Я использую приведенный ниже код для захвата и хранения изображений.

public void launchCamera(View v) {
    Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(camera, CAMERA_PIC_REQUEST );
}

В методе onActivityResult,

String[] projection = { MediaStore.Images.ImageColumns.SIZE,
                    MediaStore.Images.ImageColumns.DISPLAY_NAME,
                    MediaStore.Images.ImageColumns.DATA, BaseColumns._ID, };
            Cursor c = null;
            Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            try {
                if (u != null) {
                    c = managedQuery(u, projection, null, null, null);
                }
                if ((c != null) && (c.moveToLast())) {
                    Bitmap thumbnail = getBitMapFromLocalPath(c.getString(2), 3);
                    idsImagesgot.add(thumbnail);
                    ContentResolver cr = getContentResolver();
                    cr.delete( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            BaseColumns._ID + "=" + c.getString(3), null);
                }
            } finally {
                if (c != null) {
                    c.close();
                }
            }

Может ли кто-нибудь помочь мне в этом отношении.

Заранее спасибо.

Sathish

Ответы на вопрос(2)

и получении изображения изMediaStore.ACTION_IMAGE_CAPTURE:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap mImageBitmap = (Bitmap) extras.get("data");
    }
}
 IgorGanapolsky24 февр. 2014 г., 16:36
@Markust Внимательно посмотрите на оригинальный вопрос пользователя. В своем коде он намерен получить эскиз.
 rockhammer16 февр. 2017 г., 19:30
@ Игорь, несмотря на намерения ОП, не могли бы вы показать решение, которое возвращает полноразмерное изображение? Это было бы действительно полезно. Спасибо
 Marcote24 февр. 2014 г., 00:43
Это вернет миниатюру, а не реальное изображение.
Решение Вопроса

сделанные ACTION_IMAGE_CAPTURE, не регистрируются в MediaStore автоматически на всех устройствах.

Официальное руководство по Android дает такой пример:http://developer.android.com/guide/topics/media/camera.html#intent-receive Но это работает не на всех устройствах.

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

Редактировать после комментария:

Создайте временное имя файла, в котором будет храниться фотография при запуске намерения.

File tempFile = File.createTempFile("my_app", ".jpg");
fileName = tempFile.getAbsolutePath();
Uri uri = Uri.fromFile(tempFile);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, PICTURE_REQUEST_CODE);

fileName Строка, поле вашей деятельности. Вы должны сохранить его таким образом:

@Override
public void onSaveInstanceState(Bundle bundle)
{
 super.onSaveInstanceState(bundle);
 bundle.putString("fileName", fileName);
}

и восстановить его в onCreate ():

public void onCreate(Bundle savedInstanceState)
{
 if (savedInstanceState != null)
  fileName = savedInstanceState.getString("fileName");
 // ...
}

Теперь, во время onActivityResult, вы знаете имя файла, где хранилась фотография (fileName). Вы можете сделать с ним все, что пожелаете, а затем удалить его.

2013-09-19 edit: Кажется, что некоторые приложения камеры игнорируют putExtra uri и хранят картинку в другом месте. Итак, перед использованием значенияfileName Вы должны проверить, является ли намерение нулевым или нет. Если вы получаете ненулевое намерение, то вы должны предпочестьintent.getData() надfileName, использованиеfileName в качестве резервного решения только тогда, когда это необходимо.

 sathish18 окт. 2012 г., 14:17
Спасибо за ваш ответ, Реми, не могли бы вы дать мне какой-либо возможный способ, который отвечает моим требованиям, изложенным выше, если это возможно?
 sathish19 окт. 2012 г., 16:07
Привет Реми, спасибо за твой код. Я использую то же самое выше и предоставляю URI для намерения захвата, и после сохранения моего изображения на сервере я удаляю это временное изображение, но изображение все еще доступно в галерее по умолчанию. галерея по умолчанию.
 Rémi19 окт. 2012 г., 20:09
Как вы удаляете файл? Что-то вродеgetContentResolver().delete(uri, null, null); должно работать, я полагаю.
 A.J. Uppal10 апр. 2014 г., 02:06
Что такоеPICTURE_REQUEST_CODE в шестой строке первого абзаца кода?
 Rémi18 окт. 2012 г., 18:40
Я отредактировал свой ответ

Ваш ответ на вопрос