Захват изображений с 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");
}
}