开发者

Getting identifier of originating button used to call camera intent on Android

开发者 https://www.devze.com 2023-03-14 03:18 出处:网络
If I have multiple buttons on a view to call camera intent (android.provider.MediaStore.ACTION_IMAGE_CAPTURE) and a ImageView for the preview of each image and I need to know which button called it in

If I have multiple buttons on a view to call camera intent (android.provider.MediaStore.ACTION_IMAGE_CAPTURE) and a ImageView for the preview of each image and I need to know which button called it in onActivityResult so I know which corresponding preview to use how do I pass an identifying variable? Below is current code that only works with one image.

Picture button:

final ImageButton cameraTakePhotoButton = (ImageButton) photoPromptOption.findViewById(R.id.cameraTakePhotoButton);

cameraTakePhotoButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
    }
});

onActivityResult:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    if (resultCode == RE开发者_开发技巧SULT_OK) {
        if(requestCode == CAMERA_PIC_REQUEST) {
            Bitmap thumbnail = (Bitmap) data.getExtras().get("data");  
            final ImageView questionPhotoResult = (ImageView) findViewById(R.id.questionPhotoResult);
            questionPhotoResult.setImageBitmap(thumbnail);
        } 
    }
} 


Ended up using a ListView and custom adapter then having it iterate over an ArrayList with objects of class Photo... I update the Bitmap (thumbnail) property for the Photo objects when I take the picture then refresh the ListView. This method works very well.

photoListView.setAdapter(new ArrayAdapter<Photo>(this, R.layout.photo_list_item, photosList) {
     @Override
     public View getView(final int position, View convertView, final ViewGroup parent) {

              View row = null;

              final Photo thisPhoto = getItem(position);

              if (null == convertView) {
                   LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                   row = inflater.inflate(R.layout.photo_list_item, null);
               } else {
                   row = convertView;
               }

               photoPreview.setOnClickListener(new View.OnClickListener() {
                   public void onClick(View view) {

                        File photoDirectory = new File(Environment.getExternalStorageDirectory()+"/Pictures/appName");

                        if(!photoDirectory.isDirectory()) {
                             photoDirectory.mkdir();
                        }

                        File photo = new File(Environment.getExternalStorageDirectory()+"/Pictures/appName/", thisPhoto.getId()+"_photo.jpg");
                        CameraHandlerSingleton.setPictureUri(Uri.fromFile(photo));
                        CameraHandlerSingleton.setPhotoId(thisPhoto.getId());

                        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
                        startActivityForResult(intent, CAMERA_PIC_REQUEST);

                    }
                });

                return row;

            }

        });

Then my onActivityResult:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == RESULT_OK) {

        if(requestCode == CAMERA_PIC_REQUEST) {  

            Uri selectedImage = CameraHandlerSingleton.getPictureUri();
            String photoId = CameraHandlerSingleton.getPhotoId();

            getContentResolver().notifyChange(selectedImage, null);
            ContentResolver cr = getContentResolver();

            Bitmap thumbnail;

            try {
                thumbnail = Bitmap.createScaledBitmap(android.provider.MediaStore.Images.Media.getBitmap(cr, selectedImage), 300, 200, true);
                p.setThumbnail(thumbnail);
                p.setTaken(true);
            } catch(FileNotFoundException e) {
                Toast.makeText(this, "Picture not found.", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            } catch(IOException e) {
                Toast.makeText(this, "Failed to load.", Toast.LENGTH_SHORT).show();
                Log.e("Camera", e.toString());
            } catch(Exception e) {
                Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
                Log.e("Camera Exception", e.toString());
                e.printStackTrace();
            }

            startActivity(getIntent());
            finish();

        }
    }
}


Yikes. Why not use requestCode? Just tag each view with a unique code, making sure it doesn't clash with any other intents you're throwing around. Alternatively, you can use Object.hashCode() , but again, watch out for clashes.

cameraTakePhotoButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST + v.getTag());
    }
});

Then check it in your handler:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    if (resultCode == RESULT_OK) {
        if(requestCode == CAMERA_PIC_REQUEST + button1.getTag()) {
            // do stuff
        } 
        else if (requestCode == CAMERA_PIC_REQUEST + button2.getTag()) {
            // do more stuff
        }
    }
} 

If you have many buttons (or items in a ListView) that you're going to handle similarly, you can use a Map to recover the calling view from the tag.

0

精彩评论

暂无评论...
验证码 换一张
取 消