5

在我的应用程序中,我点击了一个名为 Pick Photo 的按钮,它会加载图库。当我单击图库中的图像时,应用程序强制关闭,并且在我的 logcat 中我收到以下信息:

    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://media/external/images/media/3369 (has extras) }} to activity {cap.shot/cap.shot.LolcatActivity}: java.lang.NullPointerException
    at android.app.ActivityThread.deliverResults(ActivityThread.java:2655)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:2697)
    at android.app.ActivityThread.access$2000(ActivityThread.java:124)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:998)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3806)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.NullPointerException
    at cap.shot.LolcatView.loadFromUri(LolcatView.java:137)
    at cap.shot.LolcatActivity.loadPhoto(LolcatActivity.java:384)
    at cap.shot.LolcatActivity.onActivityResult(LolcatActivity.java:299)
    at android.app.Activity.dispatchActivityResult(Activity.java:3988)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:2651)

我的 lolcatactivity.java 在这里可用:http: //pastebin.com/AVL8CswT我的 lolcatview.java 在这里可用: http : //pastebin.com/vD7vCBgY

谢谢!

4

2 回答 2

3

getDrawable在您的情况下返回 null 。您使用的 urisetImageURI可能无效,因此您将获得空值。

对drawable做一个null检查,如果drawable为null,你需要保释。

编辑:

if(drawable == null)
  return;
于 2012-11-27T03:56:33.810 回答
1

我已经检查了你的代码,所以我认为你需要像这样替换你的按钮操作

    private static final int SELECT_PHOTO = 100

                    Intent photoPickerIntent = new Intent(
                            Intent.ACTION_PICK);
                    photoPickerIntent.setType("image/*");
                    startActivityForResult(photoPickerIntent, SELECT_PHOTO);

并在您的开始活动结果中给出

@Override
protected void onActivityResult(int requestCode, int resultCode,
        Intent imageReturnedIntent) {
    System.out.println("requestcode" + requestCode + "result code "
            + requestCode + "intentt" + imageReturnedIntent);

    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

    switch (requestCode) {
    case SELECT_PHOTO:
        if (resultCode == RESULT_OK) {

            // InputStream imageStream;
            try {
                Uri selectedImage = imageReturnedIntent.getData();
                Bitmap yourSelectedImage = decodeUri(selectedImage);
                // imageStream = getContentResolver().openInputStream(
                // selectedImage);
                // Bitmap yourSelectedImage = BitmapFactory
                // .decodeStream(imageStream);
                try {
                    yourimageview.setImageBitmap(yourSelectedImage);
                    picArray = convertBitmap(yourSelectedImage);
                    String imagepath_new = getRealPathFromURI(selectedImage);

                    System.out.println("gakk" + imagepath_new);
                    String[] s = imagepath_new.split("/");
                    System.out.println(s[s.length - 1]);
                    String imageName1 = s[s.length - 1];
                    imageName1 = imageName1.replace(" ", "");

                } catch (Exception e) {
                    Toast.makeText(getApplicationContext(),
                            "Exception" + e, 1000).show();
                }

            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        break;

并且还添加这些行以避免在 Activity 中显示图像视图时出现内存泄漏。

private byte[] convertBitmap(Bitmap bm) {
    // int bytes = bm.getWidth() * bm.getHeight() * 4; // calculate how many
    // bytes our image
    // consists of. Use a
    // different value than
    // 4 if you don't use
    // 32bit images.

    // ByteBuffer buffer = ByteBuffer.allocate(bytes); // Create a new
    // buffer
    // bm.copyPixelsToBuffer(buffer); // Move the byte data to the buffer

    // byte[] array = buffer.array(); // Get the underlying array containing
    // the data.

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.PNG, 100, stream);

    byte[] array = stream.toByteArray();
    return array;
}

private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {

    // Decode image size
    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(
            getContentResolver().openInputStream(selectedImage), null, o);

    // The new size we want to scale to
    final int REQUIRED_SIZE = 140;

    // Find the correct scale value. It should be the power of 2.
    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 *= 3;
    }

    // Decode with inSampleSize
    BitmapFactory.Options o2 = new BitmapFactory.Options();
    o2.inSampleSize = scale;
    return BitmapFactory.decodeStream(
            getContentResolver().openInputStream(selectedImage), null, o2);

}

public String getRealPathFromURI(Uri contentUri) {

    // can post image
    String[] proj = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(contentUri, proj, // Which columns to
                                                    // return
            null, // WHERE clause; which rows to return (all rows)
            null, // WHERE clause selection arguments (none)
            null); // Order-by clause (ascending by name)
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();

    return cursor.getString(column_index);

}

private Bitmap decodeFile(File f) {
    Bitmap b = null;
    try {
        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;

        FileInputStream fis = new FileInputStream(f);
        BitmapFactory.decodeStream(fis, null, o);

        fis.close();

        int scale = 10;
        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        fis = new FileInputStream(f);
        b = BitmapFactory.decodeStream(fis, null, o2);
        fis.close();
    } catch (IOException e) {

    }
    return b;
}

希望这会帮助你

于 2012-11-27T04:25:10.237 回答