web-dev-qa-db-ja.com

カメラのインテント結果からパスとファイル名を取得する

カメラインテントで写真を作成し、デフォルトのDCIMフォルダーに保存したいと思います。次に、画像が保存されているパス/ファイル名を取得します。

私は次のコードでそれを試しています:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, TAKE_PICTURE);

このコードを使用すると、カメラが開き、1枚の写真を撮った後、カメラを閉じて、デフォルトの画像フォルダー(通常は/ dcim/cameraまたはsdcard/dcim/camera ...)に保存します。

しかし、どうすれば撮影した写真のパスとファイル名を取得できますか? onActivityResultでほとんどすべてを試しました

String result = data.getData();

そして

String result = data.getDataString();

そして

String result = data.toURI();

そして

Uri uri = data.getData();

等.

私はこれに対する解決策を見つけるために過去2日間を調査しました。ウェブ上やスタックオーバーフローに関する記事はたくさんありますが、何も機能しません。サムネイルは必要ありません。カメラが撮影した画像へのパス(uri?)のみが必要です。

助けてくれてありがとう

編集:私が試みるとき:

path=Environment.DIRECTORY_DCIM + "/test.jpg";
File file = new File(path);
Uri outputFileUri = Uri.fromFile(file);
Intent intent = new Intent(Android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(intent, TAKE_PICTURE); 

画像はtest.jpgとして保存されませんが、通常の画像名2011-10-03 ..... jpgで保存されます(ただし、これも問題ありません。画像へのパスのみが必要です。名前は関係ありません。です)。

宜しくお願いします

再度編集

path=Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/";
File file = new File(path,"test111111111.jpg");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
Uri outputFileUri = Uri.fromFile(file);
Intent intent = new Intent(Android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

startActivityForResult(intent, TAKE_PICTURE); 

これを試してみると、画像が適切なフォルダに指定された名前(test111111.jpgなど)で保存されます。しかし、onActivityResultでファイルパスを取得するにはどうすればよいですか?

17
bihcoder

画像は2回保存されます。最初はギャラリーフォルダーに保存され、その後、putExtra(MediaStore.EXTRA_OUTPUT、path)メソッドで指定したファイルに保存されます。

あなたはそれをして撮られた最後の写真を得ることができます:

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

このサンプルは投稿に基づいています: カメラインテント写真を撮影した後にギャラリー画像を削除する

6
Derzu

onActivityResult()でこのように使用できます

if(requestCode==CAMERA_CAPTURE)
    {

        Cursor cursor = getContentResolver().query(Media.EXTERNAL_CONTENT_URI, new String[]{Media.DATA, Media.DATE_ADDED, MediaStore.Images.ImageColumns.ORIENTATION}, Media.DATE_ADDED, null, "date_added ASC");
        if(cursor != null && cursor.moveToFirst())
        {
            do 
            {
                String picturePath =cursor.getString(cursor.getColumnIndex(Media.DATA));
               Uri selectedImage = Uri.parse(picturePath);

            }
            while(cursor.moveToNext());
                cursor.close();
            File out = new File(picturePath);
            try 
            {
                mOriginal = decodeFile(out);
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            mSelected.setImageBitmap(mOriginal);
        }
    }
1
Pranav

_ACTION_IMAGE_CAPTURE_を開始するときに、画像を保存するファイルのURIとして追加の _MediaStore.EXTRA_OUTPUT_ を渡すことができます。

簡単な例を次に示します。

_   File file = new File(path);
   Uri outputFileUri = Uri.fromFile(file);

   Intent intent = new Intent(Android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
   intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

   startActivityForResult(intent, TAKE_PICTURE); 
_

編集: デバイスを試してみたところ、file.createNewFile()で問題が解決しました。

0
Ovidiu Latcu