Android中Bitmap.createBitmap上的空指针异常

时间:2015-08-01 10:32:23

标签: android bitmap android-imageview android-orientation

我正在开发相机应用程序,我的问题是,在某些设备上,相机拍摄的图像在旋转时,将其设置为imageview时,我已经搜索了一个解决方案,我找到了一个解决方案链路。camera intent auto rotate to 90 degree。我的问题是当我调用方法生成旋转的位图图像时,它在下一行显示NPE

  Bitmap rotatedBitmap = Bitmap.createBitmap( bitencoded, 0, 0,  bitencoded.getWidth(),
            bitencoded.getHeight(), matrix, true);

完整代码

 private Bitmap rotateCam()
{
    Matrix matrix = new Matrix();
    matrix.postRotate(getImageOrientation(picturePath));

    Bitmap rotatedBitmap = Bitmap.createBitmap( bitencoded, 0, 0,  bitencoded.getWidth(),
            bitencoded.getHeight(), matrix, true);
    imageView.setImageBitmap(rotatedBitmap);
    return rotatedBitmap;
}

logcat的

java.lang.NullPointerException
        at project1.me.com.update.ImageUploadActivity.rotateCam(ImageUploadActivity.java:235)
        at project1.me.com.update.ImageUploadActivity.onCreate(ImageUploadActivity.java:182)
        at android.app.Activity.performCreate(Activity.java:5206)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
        at android.app.ActivityThread.access$700(ActivityThread.java:140)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4921)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
        at dalvik.system.NativeStart.main(Native Method)

onCreate

 byte[] data = picturePath.getBytes("UTF-8");
          String base64PicPath = Base64.encodeToString(data, Base64.DEFAULT);

          bitencoded=  stringToBitMap(base64PicPath);
          try
          {
              rotateCam();
              Log.e(" Rotated", "Method  called");
          }
          catch(Exception e)
          {
            Log.e("Not Rotated","Method not called");
            e.printStackTrace();
            Log.e(e.getClass().getName(), e.getMessage(), e);
        }

getImageOrientation()

 public static int getImageOrientation(String imagePath){
    int rotate = 0;
    try {

        File imageFile = new File(imagePath);
        ExifInterface exif = new ExifInterface(
                imageFile.getAbsolutePath());
        int orientation = exif.getAttributeInt(
                ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_NORMAL);

        switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_270:
                rotate = 270;
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                rotate = 180;
                break;
            case ExifInterface.ORIENTATION_ROTATE_90:
                rotate = 90;
                break;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return rotate;
}

我是初学者,我找不到NPE的原因。可以帮助我帮忙吗?。提前付款。

2 个答案:

答案 0 :(得分:1)

使用此方法转换位图。

 private Bitmap decodeFile(String filePath) {

    // Decode image size
    try {

        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;

        BitmapFactory.decodeFile(filePath, o);
        final int REQUIRED_SIZE = 1024;
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;
        while (true) {
            if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE)
                break;
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }

        o.inJustDecodeBounds = false;

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        bitmap = BitmapFactory.decodeFile(filePath, o2);

    }
    catch (Exception e) {
        Log.e(e.getClass().getName(), e.getMessage(), e);
    }
   return bitmap;
}

onCreate():

bitmap = decodeFile(picturePath);
rotateCam();

在rotateCam()中设置ImageView:

public void rotateCam() {
    Matrix matrix = new Matrix();
    matrix.postRotate(getImageOrientation(picturePath));
    Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, 
        bitmap.getWidth(),
        bitmap.getHeight(), matrix, true);
    imageView = (ImageView) findViewById(R.id.imgView);
    imageView.setImageBitmap(rotatedBitmap);
 }

答案 1 :(得分:0)

Bitmap bitencoded=null;
bitencode.getWidth();

您正在对bitencoded的空引用调用方法getWidth()。 应该这样做,

Bitmap bitencode = BitmapFactory.decodeResource(getResources(), R.drawable.yourBitmap);

然后,

bitencode.getWidth();