web-dev-qa-db-ja.com

ACTION_IMAGE_CAPTUREインテントから画像のパスを取得します

こんにちは、次のようにIntentを使用して画像をキャプチャするためにACTION_IMAGE_CAPTUREを使用しています。

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メソッドを使用してその画像のパスを取得する必要があります。現在キャプチャされている画像の画像パスを取得する方法がわかりません。

誰かが知っているなら助けてください。

ありがとう

23
iCoder86

これは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);
_

UPDATE:新しいAndroidデバイスでは、MediaStore.EXTRA_OUTPUTは必要ありませんが、画像/ビデオURIを以下で適切に説明されているように、onActivityResult(...、Intent data)から受け取ったdata.getData()

Android ACTION_IMAGE_CAPTUREインテント

ただし、この部分は製造業者による調整の対象となるため、「古い」アプローチが役立つ可能性のある電話に遭遇する可能性があります。

50
Zelimir

Android 2.1でテストされた別の方法は、ギャラリーの最後の画像のIDまたは絶対パスを取ることです。

それはそのように行うことができます:

/**
 * 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) } );
}

このコードは次の投稿に基づいています: カメラインテント写真を撮った後にギャラリー画像を削除する

7
Derzu

削除する

intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);  

そして追加

Uri uri = data.getData();in onActivityResult
2
ahmad

この質問は非常に古いですが、私は同じ問題を半日と戦っています。問題は、ACTION_IMAGE_CAPTUREファイルでアプリケーションに次の権限を設定しない限り、code=-1インテントが常にdata=nullおよびAndroidManifest.xmlを返すことです。

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

アプリケーションからオーディオを録音する場合は、以下を設定することもできます。

<uses-permission Android:name="Android.permission.RECORD_AUDIO"/>
2
Lukuluba