AndroidのMediaStoreを使用してカメラからディスクにデータを保存するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/649057

質問

アプリケーションでは、画像とデータベースを取得するために独自のカメラクラスを使用していましたが、すぐに変更に追いつくことができず、Androidの組み込みカメラアプリケーションを使用して仕事ですが、ファイルを保存することができません。ここに何が欠けていますか?アプリケーションはファイルを保存しているように見えますが、0バイトです。 Cameraアプリケーションのソースコードを検索し、<!> quot; output <!> quot;を探しています。 Extrasでファイルを保存します。どんな助けも大歓迎です。

Public class CameraTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button cameraButton = (Button) findViewById(R.id.cameraButton);
        cameraButton.setOnClickListener( new OnClickListener(){
            public void onClick(View v ){
                ContentValues values = new ContentValues();
                values.put(Images.Media.TITLE, "title");
                values.put(Images.Media.BUCKET_ID, "test");
                values.put(Images.Media.DESCRIPTION, "test Image taken");
                Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra("output", uri.getPath());
                startActivityForResult(intent,0);
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode== 0 && resultCode == Activity.RESULT_OK){
            ((ImageView)findViewById(R.id.pictureView)).setImageURI(data.getData());
        }
    }


}
役に立ちましたか?

解決

これは次のコードで機能しましたが、最後のコードでは少し馬鹿げていました。私はまだ、元の画像がまだどこかに保存されるように、より良い方法がなければならないと思います。 25%サイズの小さい画像が引き続き送信されます。

public class CameraTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button cameraButton = (Button) findViewById(R.id.cameraButton);
    cameraButton.setOnClickListener( new OnClickListener(){
        public void onClick(View v ){

            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");

            startActivityForResult(intent,0);
        }
    });

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode== 0 && resultCode == Activity.RESULT_OK) {
        Bitmap x = (Bitmap) data.getExtras().get("data");
        ((ImageView)findViewById(R.id.pictureView)).setImageBitmap(x);
        ContentValues values = new ContentValues();
        values.put(Images.Media.TITLE, "title");
        values.put(Images.Media.BUCKET_ID, "test");
        values.put(Images.Media.DESCRIPTION, "test Image taken");
        values.put(Images.Media.MIME_TYPE, "image/jpeg");
        Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
        OutputStream outstream;
        try {
            outstream = getContentResolver().openOutputStream(uri);
            x.compress(Bitmap.CompressFormat.JPEG, 70, outstream);
            outstream.close();
        } catch (FileNotFoundException e) {
            //
        } catch (IOException e) {
            //
        }
    }
}

また、Androidのカップケーキリリースでは、すぐに小さな画像サイズが修正されることを知っています。

他のヒント

以下のコードは、デフォルトのカメラを起動し、カメラに指定されたURIに画像を保存させます。重要なのは、余分な<!> quot; MediaStore.EXTRA_OUTPUT <!> quot;を追加することです。目的のURIとともに。

File file = new File(Environment.getExternalStorageDirectory().getPath() + "/Images/" + image_name + ".jpg");
Uri imageUri = Uri.fromFile(file);

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

startActivityForResult(intent, 0);

最初の試行では、カメラアプリが<!> quot; output <!> quotを読み取ったときにクラッシュする可能性があります。余分な、それはそれがウリであると期待するので、あなたは文字列を提供します。カメラアプリは、写真をキャプチャした後に余分なフラグを読み取るようです。 uri.getPath()ではなく、uriのみを提供する必要があります。次に、写真のURIを既に知っているため、onResult呼び出しで返されません。メンバー変数のURIを覚えておく必要があります。

2回目の試行では、縮小(50%)ビットマップが返されます。主にビューを対象としています。フルサイズのビットマップは、アプリケーションのメモリバジェットに対して大きすぎると思います。これがダウンスケールの理由かもしれません。

FYI、ドキュメントでこれを見つけました: 呼び出し元は、このイメージが書き込まれる場所を制御するために、追加のEXTRA_OUTPUTを渡すことができます。 EXTRA_OUTPUTが存在しない場合、小さなサイズの画像が追加フィールドのビットマップオブジェクトとして返されます。これは、小さな画像のみを必要とするアプリケーションに役立ちます。 EXTRA_OUTPUTが存在する場合、フルサイズの画像はEXTRA_OUTPUTのUri値に書き込まれます。

こちら: http://developer.android.com/reference/ android / provider / MediaStore.html

だから、どこにそれを指定すれば、アプリはフルサイズの画像を保存できます。

**編集:これはHTCデバイスの場合ではありません。 htc sense uiを使用するHTC(nexusではない)は、Android 1.5から分岐し、常に低解像度で画像を保存するバグを抱えています。カメラのアクティビティをランチし、カメラの共有機能を使用してフルサイズの画像を使用できます。

エミュレータでも同じ問題が発生しましたが、 実際の電話で試してみましたが、 仮想電話が実際に写真を撮ることができないためかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top