从画廊中抓取图片时出现空指针异常

时间:2014-02-12 03:40:34

标签: android android-camera android-camera-intent

我有以下代码,用于抓取图像(来自相机或图库),然后将其显示在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);
}

如果我尝试使用Camera抓取图像,代码可以正常工作,但是当我尝试从Gallery中抓取图像时,它会返回NULL指针异常。

有人能建议我走向正确的方向吗?感谢

这是完整的日志:

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)

3 个答案:

答案 0 :(得分:1)

你onActivityResult非常混乱。

尝试以这种方式编写代码.. 下面的方法是定义从相机捕获图像和分别从图库中拍摄图像。

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

现在onActivityResult你的代码可能是这样的......

@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) {
            }
        }
    }

使用参数requestCoderesponseCode

更好地补充onActivityResult

答案 1 :(得分:0)

试试这段代码:

在xml中创建一个imageview

ImageView photoFrame;
public static final int REQ_CODE_PICK_IMAGE         = 101;
在oncreate中

添加:

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

添加以下代码:

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

为Utils创建一个类,在其中添加以下代码:

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

使用此代码,您可以从图库中选择图像,并可以在Imageview上查看图像

答案 2 :(得分:0)

尝试我的工作代码,需要使用其ID

从mediastore查询图库图像
@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);
}