Question

i have the following code, which is used to grab images (either from camera or gallery) and then display it on an ImageView:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if(resultCode == RESULT_OK)
    {
        if(requestCode == 1888)
        {
            final boolean isCamera;
            if(data == null)
            {
                isCamera = true;
            }
            else
            {
                final String action = data.getAction();
                if(action == null)
                {
                    isCamera = false;
                }
                else
                {
                    isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                }
            }

            Uri selectedImageUriTemp;
            Uri selectedImageUri;
            if(isCamera)
            {
                selectedImageUriTemp = outputFileUri;
                Bitmap image = decodeFile(new File(selectedImageUriTemp.getPath()));
                selectedImageUri = getImageUri(image);
            }
            else
            {
                selectedImageUriTemp = data == null ? null : data.getData();
                Bitmap image = decodeFile(new File(selectedImageUriTemp.getPath()));
                selectedImageUri = getImageUri(image);
            }

            Log.i("TAG", "IMAGEURI: " + selectedImageUri);

            pictureThumb.setImageURI(selectedImageUri);
            setRealPath(selectedImageUri);
        }
    }
}

private Uri getImageUri(Bitmap image){
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = Images.Media.insertImage(getApplicationContext().getContentResolver(), image, "Title", null);
    return Uri.parse(path);
}

The code works if i try to grab an image using Camera, however when i try to grab an image from Gallery it returns NULL pointer exception.

Can anyone suggest me to the right direction? Thanks

here is the full log:

02-12 10:34:56.249: E/AndroidRuntime(14607): FATAL EXCEPTION: main
02-12 10:34:56.249: E/AndroidRuntime(14607): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1888, result=-1, data=Intent { dat=content://media/external/images/media/29 }} to activity {com.gelliesmedia.thumbqoo/com.gelliesmedia.thumbqoo.PictureBooth}: java.lang.NullPointerException: uriString
02-12 10:34:56.249: E/AndroidRuntime(14607):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3216)
02-12 10:34:56.249: E/AndroidRuntime(14607):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3259)
02-12 10:34:56.249: E/AndroidRuntime(14607):    at android.app.ActivityThread.access$1100(ActivityThread.java:138)
02-12 10:34:56.249: E/AndroidRuntime(14607):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1253)
02-12 10:34:56.249: E/AndroidRuntime(14607):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-12 10:34:56.249: E/AndroidRuntime(14607):    at android.os.Looper.loop(Looper.java:137)
02-12 10:34:56.249: E/AndroidRuntime(14607):    at android.app.ActivityThread.main(ActivityThread.java:4954)
02-12 10:34:56.249: E/AndroidRuntime(14607):    at java.lang.reflect.Method.invokeNative(Native Method)
02-12 10:34:56.249: E/AndroidRuntime(14607):    at java.lang.reflect.Method.invoke(Method.java:511)
02-12 10:34:56.249: E/AndroidRuntime(14607):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
02-12 10:34:56.249: E/AndroidRuntime(14607):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
02-12 10:34:56.249: E/AndroidRuntime(14607):    at dalvik.system.NativeStart.main(Native Method)
02-12 10:34:56.249: E/AndroidRuntime(14607): Caused by: java.lang.NullPointerException: uriString
02-12 10:34:56.249: E/AndroidRuntime(14607):    at android.net.Uri$StringUri.<init>(Uri.java:464)
02-12 10:34:56.249: E/AndroidRuntime(14607):    at android.net.Uri$StringUri.<init>(Uri.java:454)
02-12 10:34:56.249: E/AndroidRuntime(14607):    at android.net.Uri.parse(Uri.java:426)
02-12 10:34:56.249: E/AndroidRuntime(14607):    at com.gelliesmedia.thumbqoo.PictureBooth.getImageUri(PictureBooth.java:224)
02-12 10:34:56.249: E/AndroidRuntime(14607):    at com.gelliesmedia.thumbqoo.PictureBooth.onActivityResult(PictureBooth.java:206)

No correct solution

OTHER TIPS

You onActivityResult is very messy.

Try to write code something like this way.. Below tow method is define to capture image from camera and taking image from gallery respectively.

protected void captureFromCamera() {
        // TODO Auto-generated method stub
        Intent cameraIntent = new Intent(
                android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

        startActivityForResult(cameraIntent,
                UploadProfilePicActivity.REQ_CAMERA);
    }

    private void selectImageFromGallery() {
        // TODO Auto-generated method stub
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent,
                getString(R.string.upload_profile_photo)),
                UploadProfilePicActivity.REQ_GALLERY);
    }

Now onActivityResult your code could be something like this..

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == UploadProfilePicActivity.REQ_GALLERY && data != null
                && data.getData() != null) {
            Uri _uri = data.getData();
            try {
                Bitmap profileBmp = Media.getBitmap(getContentResolver(), _uri);
                if (profileBmp != null) {
                    image.setImageBitmap(profileBmp);
                }

            } catch (OutOfMemoryError e) {
                Utility.displayToast(context,
                        getString(R.string.err_large_image));
            } catch (Exception e) {

            }
        } else if (requestCode == UploadProfilePicActivity.REQ_CAMERA
                && data != null) {
            try {
                Bitmap profileBmp = (Bitmap) data.getExtras().get("data");
                if (profileBmp != null) {
                    image.setImageBitmap(profileBmp);
                }
            } catch (OutOfMemoryError e) {
                Utility.displayToast(context,
                        getString(R.string.err_large_image));
            } catch (Exception e) {
            }
        }
    }

A better imnplementation of onActivityResult using the parameters i.e requestCode and responseCode

try this code:

create a imageview in your xml

ImageView photoFrame;
public static final int REQ_CODE_PICK_IMAGE         = 101;

in oncreate add this:

  photoFrame.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                try
                {
                    Intent galleryIntent = new Intent(Intent.ACTION_PICK,
                               android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    startActivityForResult(galleryIntent, REQ_CODE_PICK_IMAGE); 
                }catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
        });

in OnActivityResult add this code:

       protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode) { 
    case REQ_CODE_PICK_IMAGE:
        if(resultCode == RESULT_OK)
        {  
            Uri selectedImage = data.getData();
            String[] filePathColumn = {MediaStore.Images.Media.DATA};

            Cursor cursor = getContentResolver().query(
                               selectedImage, filePathColumn, null, null, null);
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            photoPath = cursor.getString(columnIndex);
            cursor.close();
            photoFrame.setImageBitmap(Utils.getScaledImage(photoPath, 120, 120));
        }
    }
}

create a class for Utils, add this code in it:

    public static Bitmap getScaledImage(String path, int width, int height){
        try {
            //decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(path ,o);              
            //Find the correct scale value. It should be the power of 2.
            final int REQUIRED_SIZE=70;
            int width_tmp=o.outWidth, height_tmp=o.outHeight;
            int scale=1;
            while(true){
                if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                    break;
                width_tmp/=2;
                height_tmp/=2;
                scale++;
            }

            //decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize=scale;
            Bitmap scaledPhoto = BitmapFactory.decodeFile(path, o2);
            scaledPhoto = Bitmap.createScaledBitmap(scaledPhoto, width, height, true);
            return scaledPhoto;
        } 
        catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

with this code you can select a image from gallery and you can view image on Imageview

Try my working code, The gallery images need to be queried from mediastore using its id

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(resultCode == RESULT_OK)
    {
        if(requestCode == CAMERA_PIC_REQUEST)
        {               
            loadCameraImage();
            // Loading from camera is based on the intent passed
        }
        else if(requestCode == SELECT_PICTURE)
        {
            Uri currentUri = data.getData();
            String realPath = getRealPathFromURI(currentUri);   
    // You will get the real path here then you can work with that path as normal
        }
    }

}

    // Gets the real path from MEDIA
public String getRealPathFromURI(Uri contentUri) {

    String [] proj={MediaStore.Images.Media.DATA};
    Cursor cursor = getContentResolver().query( contentUri, proj, null, null, null); 
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();

    return cursor.getString(column_index);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top