Получить путь к изображению из намерения ACTION_IMAGE_CAPTURE - PullRequest
23 голосов
/ 15 ноября 2010

Привет. Я использую 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. Я не знаю, как определить путь к текущему захваченному изображению.

Если кто-нибудь знает, пожалуйста, помогите.

Спасибо

Ответы [ 4 ]

50 голосов
/ 15 ноября 2010

Так работает на 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), как хорошо описано в

Android ACTION_IMAGE_CAPTURE Intent

Однако, поскольку эта часть подлежит адаптации изготовителем, вы все равно можете столкнуться с телефонами, в которых может быть полезен «старый» подход.

7 голосов
/ 30 января 2012

Другой способ, протестированный на 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) } );
}

Этот код был основан на посте: Удаление изображения галереи после того, как фото сделано намеренно

2 голосов
/ 06 декабря 2015

Удалить

intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);  

и добавьте

Uri uri = data.getData();in onActivityResult
2 голосов
/ 25 апреля 2012

Этот вопрос очень старый, но я боролся с той же проблемой уже полдня.Проблема в том, что ваше ACTION_IMAGE_CAPTURE намерение всегда будет возвращать code=-1 и data=null, если вы не установите следующие разрешения для приложения в файле AndroidManifest.xml:

<uses-permission android:name="android.permission.CAMERA"/>

Вы также можете установитьесли вы хотите записать аудио из вашего приложения:

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
...