Search code examples
androidandroid-intentandroid-cameraandroid-bitmapandroid-camera-intent

error capture photo and display thumbnail android studio


Hi I'm making an app for my internship and i got an error.
please help me solve this

this is activity.java

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intents
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File
        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(this, "com.example.android.provider", photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
        }
    }
}

and this is onActivityResult() code:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && requestCode == REQUEST_TAKE_PHOTO) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        imageView.setImageBitmap(imageBitmap);
    }
    if (resultCode == Activity.RESULT_OK){
        if (requestCode == PICK_FILE_REQUEST){
            if (data == null){
                return;
            }

            Uri selectedFileUri = data.getData();
            selectedFilePath = FilePath.getPath(this, selectedFileUri);
            Log.i(TAG,"Selected File Path:"+selectedFilePath);

            if (selectedFilePath != null && !selectedFilePath.equals("")){
                tv_file_name.setText(selectedFilePath);
            }else{
                Toast.makeText(this, "Cannot upload file to server", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

and i got this

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent {  }} to activity {com.example.febryan.apptest/com.example.febryan.apptest.RequestActivity2}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.os.Bundle.get(java.lang.String)' on a null object reference
                                                                           at android.app.ActivityThread.deliverResults(ActivityThread.java:4324)
                                                                           at android.app.ActivityThread.handleSendResult(ActivityThread.java:4367)
                                                                           at android.app.ActivityThread.-wrap19(Unknown Source:0)
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1649)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:105)
                                                                           at android.os.Looper.loop(Looper.java:164)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6541)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
                                                                        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.os.Bundle.get(java.lang.String)' on a null object reference
                                                                           at com.example.febryan.apptest.RequestActivity2.onActivityResult(RequestActivity2.java:311)
                                                                           at android.app.Activity.dispatchActivityResult(Activity.java:7235)
                                                                           at android.app.ActivityThread.deliverResults(ActivityThread.java:4320)

please help me solve this. thx


Solution

  • The default Android camera application returns a non-null intent only when passing back a thumbnail in the returned Intent. If you pass EXTRA_OUTPUT with a URI to write to, it will return a null intent and the picture is in the URI that you passed in.

    So since your passing EXTRA_OUTPUT location with your intent it will always retun the null with data and i.e in your case now the photo / captured image is at photoURI path.

    So instead of looking into the data intent in the onActivityResult() take it from the photoURI path. Like below.Here photo file is the file EXTRA_OUTPUT location where you saved the actual camera image

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK && requestCode == REQUEST_TAKE_PHOTO) {
    
            Uri uri = Uri.fromFile(photoFile);  // Here photo file is the file EXTRA_OUTPUT location where you saved the actual camera image
            Bitmap bitmap;
            try {
                bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                bitmap = crupAndScale(bitmap, 300); // if you mind scaling
                pofileImageView.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            imageView.setImageBitmap(bitmap);
        }
    
    }
    

    if you would like to crop and scale this image , probably as you mention for thumbnail image.

    public static  Bitmap crupAndScale (Bitmap source,int scale){
        int factor = source.getHeight() <= source.getWidth() ? source.getHeight(): source.getWidth();
        int longer = source.getHeight() >= source.getWidth() ? source.getHeight(): source.getWidth();
        int x = source.getHeight() >= source.getWidth() ?0:(longer-factor)/2;
        int y = source.getHeight() <= source.getWidth() ?0:(longer-factor)/2;
        source = Bitmap.createBitmap(source, x, y, factor, factor);
        source = Bitmap.createScaledBitmap(source, scale, scale, false);
        return source;
    }