6

写真を撮ってサムネイルを表示するプログラムを作成しています。エミュレーターを使用すると、すべてがうまくいき、破棄ボタンで写真が削除されます。しかし、実際のデバイスでは、カメラのインテントは画像を imageUri 変数に保存し、2 番目の変数には、カメラを開いて自分で写真を撮ったかのように名前を付けます。

private static final int CAMERA_PIC_REQUEST = 1337;  
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera);

    //start camera
    values = new ContentValues();
    values.put(MediaStore.Images.Media.TITLE, "New Picture");
    values.put(MediaStore.Images.Media.DESCRIPTION,"From your Camera");
    imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    image = (ImageView) findViewById(R.id.ImageView01);
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    startActivityForResult(intent, CAMERA_PIC_REQUEST);


    //save the image buttons
    Button save = (Button) findViewById(R.id.Button01);
    Button close = (Button) findViewById(R.id.Button02);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAMERA_PIC_REQUEST && resultCode == RESULT_OK) {
        try{
            thumbnail = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
            image.setImageBitmap(thumbnail);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
     else{
         finish();
     }
}

public void myClickHandler(View view) {
    switch (view.getId()) {
    case R.id.Button01:
        finish();
        break;
    case R.id.Button02:
        dicard();
    }
}

private void dicard(){
    getContentResolver().delete(imageUri, null, null);
    finish();
}
4

1 に答える 1

1

一部の Android スマートフォンでは、元の写真がギャラリーに保存され、サムネイルは現在地にのみ保存されます。元のリクエストで何をしたかは問題ではありません。私は 2 つの異なる HTC 電話でそれを行っていますが、他の多くのブランドではそれを行っていません。

これを別の方法で解決しました。ギャラリー内のすべてのアイテムのクエリを実行し、BucketID を配列にロードしました。アプリがカメラアプリを起動するときにこれを行います。カメラ アプリが戻ってきたら、同じクエリを作成します (時間を節約するために最近追加された項目を使用します)。これを元のリストと比較して、新しい BucketID を見つけます。次に、この画像のサイズを、出力として明示的に設定したファイルと比較します。大きい場合はコピーして、私が持っていたものを置き換えます。次に、ファイルを削除し、ギャラリーから削除します。

あなたが知っていることの痛み!

[編集] 一意のバケット ID を保持していない電話を発見したとき、これを再度変更する必要がありました...詳細については、この回答に続くリンクの私の投稿を参照してください。

于 2011-06-23T16:09:31.920 に答える