10

私のアプリケーションでは、画像と独自のデータベースを取得するために独自の Camera クラスを使用していましたが、すぐに変更についていくことができなくなり、Android に組み込まれているカメラ アプリケーションを使用して作業を行うことにしましたが、ファイルを保存することができないようです。ここで何が欠けていますか?アプリケーションはファイルを保存しているように見えますが、わずか 0 バイトです。カメラ アプリケーションのソース コードを調べたところ、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());
        }
    }


}
4

5 に答える 5

16

これは次のコードで機能しましたが、私は最後のコードで少しばかげていました。元の画像がどこかに保存されるようにするには、もっと良い方法が必要だと思います。まだ小さい 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 のカップケーキ リリースでは、小さな画像サイズがすぐに修正されることを知っています。

于 2009-03-16T03:31:05.603 に答える
6

以下のコードは、デフォルトのカメラを起動し、カメラに画像を指定された uri に保存させます。重要なのは、追加の「MediaStore.EXTRA_OUTPUT」を目的の 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);
于 2011-09-01T21:20:45.070 に答える
4

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

ここにあります:http://developer.android.com/reference/android/provider/MediaStore.html

そのため、アプリにフルサイズの画像を保存することができます。

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

于 2010-06-28T07:25:46.903 に答える
4

最初の試行では、文字列を提供しているときに Uri であると想定されるため、「出力」エクストラを読み取るときにカメラ アプリがクラッシュする可能性があります。カメラ アプリは、写真をキャプチャした後に余分なフラグを読み取るようです。uri.getPath() ではなく、uri のみを提供する必要があります。次に、写真への URI は既にわかっているため、onResult 呼び出しでは返されません。メンバー変数の URI を覚えておく必要があります。

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

于 2009-08-24T11:57:40.587 に答える
0

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

于 2010-03-25T17:53:44.937 に答える