Trouble working with the camera in onActivityResult

I have two options “select photo” and “take photo” – I have my select photo functionality fully working, but having problems with taking a photo. Mainly having the saved image display in my image view, after its been saved.

Defined my photo location:

  • Prevent enter key on EditText but still show the text as multi-line
  • Bad token exception - Unable to add window (Marshmallow - Floating toolbar)
  • How can I tell if a closed path contains a given point?
  • Where to add folder of classes in Android Studio?
  • last block incomplete with CipherInputStream/CipherOutputStream, even with padding AES/CBC/PKCS5Padding
  • Same-named attributes in attrs.xml for custom view
  • public class photoActivity extends Activity {   
          private String photoPath;
          private ImageView imgView;
    {...} 
    

    My camera listener:

    bPicFromCam.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
    
                String state = Environment.getExternalStorageState();
    
                if (Environment.MEDIA_MOUNTED.equals(state)) {
    
                    long captureTime = System.currentTimeMillis();
    
                    photoPath = Environment.getExternalStorageDirectory() + "/MYAPP" + captureTime + ".jpg";
    
                    getPicFromCam(v);
                }
                else{
    
                    Toast.makeText(getApplicationContext(),
                        "Sorry there is a problem accessing your SDCard, " +
                        "please select a picture from your gallery instead.", Toast.LENGTH_LONG).show();
                }
    
            }
        });
    

    Then my code to start the camera intent (note that the photoPath is correct):

        public void getPicFromCam(View view){
    
        System.out.println("photoPath: " + photoPath);
        //Outputs the CORRECT location!
    
        try{
    
            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
            File photo = new File(photoPath);
            intent.putExtra(MediaStore.EXTRA_OUTPUT,
                    Uri.fromFile(photo));
            imageUri = Uri.fromFile(photo);
            startActivityForResult(Intent.createChooser(intent, "Capture Image"), CAPTURE_IMAGE);
    
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(),
                    getString(R.string.exception_message),
                    Toast.LENGTH_LONG).show();
            Log.e(e.getClass().getName(), e.getMessage(), e);
        }
    }
    

    OK everything seems fine up until this point – the picture is taken and the image gets saved to the specified location.

    Now I am trying to display the image in my Image view (then it can be uploaded after the user confirms its good).

    My onActivityResult:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        switch (requestCode) {
        case PICK_IMAGE:
            if (resultCode == Activity.RESULT_OK) {
                //THIS WORKS
            }
            break;
    
        case CAPTURE_IMAGE:         
    
            if (resultCode == RESULT_CANCELED) {
              Toast toast = Toast.makeText(this,"Canceled, no photo selected.", 1000);
              toast.show();
              return;
             }
    
            if (requestCode == CAPTURE_IMAGE && resultCode == RESULT_OK)
             {
    
                try {
    
                    System.out.println("photoPath " + photoPath);
                    //This is NULL!!!  And my problem, halp!
    
                    BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();  
                    bitmapOptions.inSampleSize = 6;  
                    bitmap = BitmapFactory.decodeFile(photoPath, bitmapOptions);
    
                    imgView.setImageBitmap(bitmap);
    
    
                } catch (Exception e) {
                    Toast.makeText(getApplicationContext(), "Internal error",
                            Toast.LENGTH_LONG).show();
                    Log.e(e.getClass().getName(), e.getMessage(), e);
    
                }
    
             }
    
            break;
        default:
        }
    }
    

    Thats the way I am currently trying it, but I have also tried using the following in my onActivityResult:

    bitmap = (Bitmap) data.getExtras().get("data");
    

    But every time I try and variation of the above method I get a NPE.

    EDIT:

        03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): null
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): java.lang.NullPointerException
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at com.myco.photoapp.SelectPhoto.onActivityResult(SelectPhoto.java:277)
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.Activity.dispatchActivityResult(Activity.java:3890)
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3115)
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143)
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684)
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.os.Handler.dispatchMessage(Handler.java:99)
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.os.Looper.loop(Looper.java:123)
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.main(ActivityThread.java:4627)
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at java.lang.reflect.Method.invokeNative(Native Method)
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at java.lang.reflect.Method.invoke(Method.java:521)
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at dalvik.system.NativeStart.main(Native Method)
    

    Above NPE comes when:

    //below is line 277
    String result = data.toURI();
    
                    BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();  
    
                    bitmapOptions.inSampleSize = 6;  
                    bitmap = BitmapFactory.decodeFile(result, bitmapOptions);
    

  • Android and setting alpha for (image) view alpha
  • Project has no default.properties file! Edit the project properties to set one
  • Disable android wear pending intent action confirmation
  • Save bitmap to file function
  • Send SMS through PhoneGap on Android
  • NPE in ChangeCurrentByOneFromLongPressCommand (on Samsung devices w/ Android 4.3)
  • 4 Solutions collect form web for “Trouble working with the camera in onActivityResult”

    Your Activity is probably being destroyed and re-created when the camera activity is going off. Maybe try saving photoPath into the Bundle in onSaveInstanceState and then fish it back out in onCreate (make sure to check for nulls in onCreate when you do so)?

    I can not using the data. But I think you need changed as follow

    photo to become general variable.

    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
    

    So, you must be take it from this folder:

    Bitmap photo = Media.getBitmap(getContentResolver(), Uri.fromFile(photo) );
    

    I follow your code and change.

    Basically put, using

    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
    

    works well

    Before placing in an imageView, make sure that you compress the image since it is extremely large when saving this way.

    int newWidth = bm.getWidth();
    int newHeight = bm.getHeight();
    while(newWidth > 300){
        newWidth = newWidth/2;
    newHeight = newHeight/2;
    }
    mImagePlaceHolder.setImageBitmap(Bitmap.createScaledBitmap(bm, newWidth, newHeight, false));
    

    I struggled with this problem and found another solution:
    just use code like this:

    Bitmap bitmap = data.getExtras().getParcelable("data");
    

    and you can get the bitmap.

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.