Получение идентификатора исходной кнопки, используемой для вызова намерения камеры на Android - PullRequest
0 голосов
/ 21 июня 2011

Если у меня есть несколько кнопок в представлении для вызова намерения камеры (android.provider.MediaStore.ACTION_IMAGE_CAPTURE) и ImageView для предварительного просмотра каждого изображения, и мне нужно знать, какая кнопка вызывала его в onActivityResult, поэтому я знаю, какой соответствующий предварительный просмотр использовать, как я передаю идентифицирующую переменную? Ниже приведен текущий код, который работает только с одним изображением.

Кнопка изображения:

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 == RESULT_OK) {
        if(requestCode == CAMERA_PIC_REQUEST) {
            Bitmap thumbnail = (Bitmap) data.getExtras().get("data");  
            final ImageView questionPhotoResult = (ImageView) findViewById(R.id.questionPhotoResult);
            questionPhotoResult.setImageBitmap(thumbnail);
        } 
    }
} 

Ответы [ 2 ]

0 голосов
/ 26 июня 2012

Хлоп.Почему бы не использовать requestCode?Просто пометьте каждое представление уникальным кодом, чтобы убедиться, что оно не противоречит другим намерениям, которые вы выбрасываете.Кроме того, вы можете использовать Object.hashCode () , но, опять же, остерегайтесь столкновений.

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

Затем проверьте это в своем обработчике:

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
        }
    }
} 

Если у вас есть много кнопок (или элементов в ListView), которые вы собираетесь обрабатывать аналогичным образом, вы можете использовать Map для восстановления вызывающего представления из тега.

0 голосов
/ 02 июля 2011

Завершается использованием ListView и пользовательского адаптера, после чего он перебирает ArrayList с объектами класса Photo ... Я обновляю свойство Bitmap (thumbnail) для объектов Photo, когда делаю снимок, затем обновляю ListView. Этот метод работает очень хорошо.

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;

            }

        });

Тогда мой 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();

        }
    }
}
...