android - 从图库中抓取图片时出现空指针异常

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

如果我尝试使用相机抓取图像,代码可以正常工作,但是当我尝试从画廊抓取图像时,它会返回 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)

最佳答案

你的 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

关于android - 从图库中抓取图片时出现空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21718138/

相关文章:

android - 如何在钛合金中向通知添加声音

android - 如何更改场景中的可渲染颜色/纹理?

android - java.lang.OutOfMemoryError处理来自Camera的14个数据

java/android不能在activity之间传递byte数组

android - android 中三星设备上的相机捕获方向

Android - 拍摄照片

android - 动态壁纸可以链接到应用程序吗?

java - 尝试使用按钮作为导航菜单时未处理的异常类型

android - Android中显示定制视频的高效路径

android java lang runtimeexception 无法连接到相机服务