Захват изображений с MediaStore.Намерение захвата изображения действия в 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 ответов


фотографии, сделанные 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: похоже, что некоторые приложения камеры игнорируют uri putExtra и хранят изображение в другом месте. Итак, перед использованием значения fileName вы должны проверить, является ли намерение имеет значение null или нет. Если вы получаете ненулевое намерение, то вы должны предпочесть intent.getData() над fileName. Использовать fileName в качестве резервного решения только тогда, когда это необходимо.


мой метод onActivityResult () выглядит так, и он работает при получении изображения из система хранения 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");
    }
}