Picture coming from camera or gallery?

后端 未结 2 704
情书的邮戳
情书的邮戳 2020-12-29 08:17

I have an intent chooser that allows me to pick image from gallery or camera like this:

    Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT,null)         


        
相关标签:
2条回答
  • 2020-12-29 09:06

    You can distinguish by using REQUEST_CODE

        private static final int PICK_FROM_CAMERA = 1;
            private static final int PICK_FROM_GALLARY = 2;
    
            /* For Image capture from camera */
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, PICK_FROM_CAMERA);   
    
        /* For Image capture from Gallary*/             
            startActivityForResult(new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI),
                                            PICK_FROM_GALLARY);
                            }
    
    
    
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
            super.onActivityResult(requestCode, resultCode, intent);
    
            switch (requestCode) {
                   case PICK_FROM_CAMERA:
                if (resultCode == Activity.RESULT_OK) {
                 Bitmap bitmapImage = (Bitmap) intent.getExtras().get("data");
                  }
                  break;
    
                    case PICK_FROM_GALLARY:
                   if (resultCode == Activity.RESULT_OK) {
                  Uri mImageCaptureUri = intent.getData();
                   }
                 break;
             }
    }
    
    0 讨论(0)
  • 2020-12-29 09:15

    Although the current piece of code is a neat way of presenting options to choose from, I found that it was severely difficult to manage. At least in my use case it was. I need to store images taken off the Camera to process further in the Aviary SDK (if the user so chooses).

    To that end, I would like to propose a workaround.

    This does not address your question per se. But offers an alternative considering you need to know where the Image is coming from (Camera / Gallery).

    AlertDialog.Builder builder = new AlertDialog.Builder(StatusUpdate.this);
    builder.setTitle("Choose Image Source");
    builder.setItems(new CharSequence[] {"Gallery", "Camera"}, 
            new DialogInterface.OnClickListener() {
    
        @Override
        public void onClick(DialogInterface dialog, int which) {
            switch (which) {
            case 0:
    
                // GET IMAGE FROM THE GALLERY
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("image/*");
    
                Intent chooser = Intent.createChooser(intent, "Choose a Picture");
                startActivityForResult(chooser, ACTION_REQUEST_GALLERY);
    
                break;
    
            case 1:
                Intent getCameraImage = new Intent("android.media.action.IMAGE_CAPTURE");
    
                File cameraFolder;
    
                if (android.os.Environment.getExternalStorageState().equals
                        (android.os.Environment.MEDIA_MOUNTED))
                    cameraFolder = new File(android.os.Environment.getExternalStorageDirectory(),
                            "some_directory_to_save_images/");
                else
                    cameraFolder= StatusUpdate.this.getCacheDir();
                if(!cameraFolder.exists())
                    cameraFolder.mkdirs();
    
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
                String timeStamp = dateFormat.format(new Date());
                String imageFileName = "picture_" + timeStamp + ".jpg";
    
                File photo = new File(Environment.getExternalStorageDirectory(), 
                        "some_directory_to_save_images/" + imageFileName);
                getCameraImage.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
                initialURI = Uri.fromFile(photo);
    
                startActivityForResult(getCameraImage, ACTION_REQUEST_CAMERA);
    
                break;
    
            default:
                break;
            }
        }
    });
    
    builder.show();
    

    This is the result (I still maintain that you code gives a much better selection set, but again, not the simplest thing in your use case or in mine either):

    enter image description here

    Now you can process the result based on the source of the selection:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK)    {
    
            switch (requestCode) {
            case ACTION_REQUEST_GALLERY:
    
                break;
    
            case ACTION_REQUEST_CAMERA:
    
                break;          
            }
    
        }
    };
    

    UPDATED:

    Found it!! There is an answer here on SO that addresses exactly what you need. It is still a * workaround of sorts*. In the sense that it does not rely on different requestCodes. But works nonetheless.

    Strange I missed it when I was stuck with this. :-(

    NOTE: I am not posting the code here and am linking to it instead. All props go to the original author. :-)

    0 讨论(0)
提交回复
热议问题