Получить путь изображения от ACTION_IMAGE_CAPTURE Intent
Привет. Я использую ACTION_IMAGE_CAPTURE
для захвата изображения с помощью Intent
следующим образом:
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(
MediaStore.EXTRA_OUTPUT, (new File(Environment.getExternalStorageDirectory(),
String.valueOf(System.currentTimeMillis()) + ".jpg"))
);
startActivityForResult(cameraIntent, 0);
Мне нужно сохранить изображение на SD-карте и получить путь к этому изображению с помощью метода onActivityResult
. Я не знаю, как получить путь к изображению текущего снимка.
Если кто-нибудь знает, пожалуйста, помогите.
Спасибо
Ответы
Ответ 1
Вот как это работает на 2.2 (отличается от предыдущих версий). При запуске намерения
String fileName = "temp.jpg";
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, fileName);
mCapturedImageURI = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
startActivityForResult(intent, CAPTURE_PICTURE_INTENT);
вам нужно запомнить mCapturedImageURI
.
При захвате изображения в onActivityResult()
используйте этот URI для получения пути к файлу:
String[] projection = { MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery(mCapturedImageURI, projection, null, null, null);
int column_index_data = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String capturedImageFilePath = cursor.getString(column_index_data);
ОБНОВЛЕНИЕ: На новых устройствах Android вам не понадобится MediaStore.EXTRA_OUTPUT, но вы скорее выведете URI изображения/видео из data.getData(), полученных из onActivityResult (..., Intent data), как хорошо описано в разделе
Android ACTION_IMAGE_CAPTURE Цель
Однако, поскольку эта часть зависит от адаптации производителя, вы все равно можете столкнуться с телефонами, где может использоваться "старый" подход.
Ответ 2
Другой способ, протестированный на Android 2.1, - взять идентификатор или AbsolutePath последнего изображения галереи.
Это можно сделать следующим образом:
/**
* Gets the last image id from the media store
* @return
*/
private int getLastImageId(){
final String[] imageColumns = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA };
final String imageOrderBy = MediaStore.Images.Media._ID+" DESC";
Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy);
if(imageCursor.moveToFirst()){
int id = imageCursor.getInt(imageCursor.getColumnIndex(MediaStore.Images.Media._ID));
String fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
Log.d(TAG, "getLastImageId::id " + id);
Log.d(TAG, "getLastImageId::path " + fullPath);
imageCursor.close();
return id;
}else{
return 0;
}
}
И удалить файл:
private void removeImage(int id) {
ContentResolver cr = getContentResolver();
cr.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media._ID + "=?", new String[]{ Long.toString(id) } );
}
Этот код был основан на сообщении: Удаление изображения галереи после снятия снимка камеры
Ответ 3
Этот вопрос очень старый, но я боролся с той же проблемой в течение полудня. Проблема в том, что ваш трюк ACTION_IMAGE_CAPTURE
всегда будет возвращать code=-1
и data=null
, если вы не установили следующие разрешения для приложения в вашем файле AndroidManifest.xml
:
<uses-permission android:name="android.permission.CAMERA"/>
Вы также можете установить следующее, если вы хотите записать звук из своего приложения:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
Ответ 4
Удалить
intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
и добавьте
Uri uri = data.getData();in onActivityResult