Android Camera intent creating two files

2019-03-14 07:44发布

问题:

I am making a program that takes a picture and then shows it's thumbnail. When using the emulator all goes well and the discard button deletes the photo. But on a real device the camera intent saves the image at the imageUri variable and a second one that is named like if I had just opened up the camera and took a picture by itself.

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();
}

回答1:

Some Android phones store the original photo in the gallery, and a thumbnail only in your location. It doesn't matter what you did with the original request. I have two different HTC phones doing it, and a slew of other brands not doing it.

I solved this another way. I ran a query of every item in the gallery and loaded the BucketIDs to an array. I do this when my app starts the camera app. When the camera app returns, I make the same query (with items recently added to save time). I compare this to my original list and find the new BucketID. Next, I compare the size of this image with the file I explicitly set as the output. If it's bigger, I copy it, replacing what I had. Then I delete the file and remove it from the gallery.

Pain in the you-know-what!

[EDIT] I had to change this around again when I discovered a phone that didn't keep unique bucket IDs... See my post in the link following this answer for more.