android - android相机中的onPictureTaken方法出错

标签 android camera

OnPictureTaken 方法中为某些手机获取 NullPointerException。我正在这样调用 takePicture 方法。

  mCamera.takePicture(shutterCallback, null, mPicture);

我的OnPictureTaken 方法

private Camera.PictureCallback mPicture = new Camera.PictureCallback() {


        public void onPictureTaken(byte[] data, Camera camera) {

            Bitmap bitmap = null;

            if(flashOff) {
                resetCamOnFlashOFF();
            }
            else {
                resetCamOnFlashOn();
            }
            File sdDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
            File dir = new File(sdDir.getAbsolutePath() + "/Camera2/");
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            String fileName = "/IMG_" + timeStamp + ".jpeg";
            boolean mkDir = dir.mkdirs();
            Log.d("Saving Photo","Created the directory" +mkDir);
            ExifInterface exif;
            try {
                exif = new ExifInterface(fileName);
                exif.setAttribute(ExifInterface.TAG_ORIENTATION, "" + orientation);
                exif.saveAttributes();
            } catch (IOException e) {
                e.printStackTrace();
            }


            try {
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = true;
                bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options);
                int reqHeight = options.outHeight;
                int reqWidth = options.outWidth;

                options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

                options.inJustDecodeBounds = false;
                bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options);
            }catch (OutOfMemoryError e){
                e.printStackTrace();
                System.gc();
            }
            Matrix matrix = new Matrix();

            switch(orientation){
                case ExifInterface.ORIENTATION_NORMAL :  matrix.postRotate(0);
                    break;
                case ExifInterface.ORIENTATION_ROTATE_90 : matrix.postRotate(90);
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180 : matrix.postRotate(180);
                    break;
                default: matrix.postRotate(270);
                    break;
            }
            assert bitmap != null;
            bitmap = Bitmap.createBitmap(bitmap, 0, 0,
                    bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            File outFile = new File(dir, fileName);


            try {
                FileOutputStream outStream = new FileOutputStream(outFile);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 95, outStream);
                bitmap.recycle();
                outStream.write(data);
                outStream.flush();
                outStream.close();
                refreshGallery(outFile);
            } catch (IOException e) {
                e.printStackTrace();

            }

            mPreview.safeToTakePicture = true;

        }
    };

只有少数手机出现 NullPointerException 错误

错误详情:

NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
    com.myDomain.camera2.r.onPictureTaken in SCamera.java:482
    android.hardware.Camera$EventHandler.handleMessage in Camera.java:1142
    android.os.Handler.dispatchMessage in Handler.java:102
    android.os.Looper.loop in Looper.java:145
    android.app.ActivityThread.main in ActivityThread.java:6141
    java.lang.reflect.Method.invoke in Method.java:-2
    java.lang.reflect.Method.invoke in Method.java:372
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run in ZygoteInit.java:1399
    com.android.internal.os.ZygoteInit.main in ZygoteInit.java:1194

最佳答案

删除代码

options.inJustDecodeBounds = true;

注意OOM。 或者试试这个:

options.inJustDecodeBounds = true;
options.inSampleSize = 5;
options.inJustDecodeBounds = false;   

关于android - android相机中的onPictureTaken方法出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30432817/

相关文章:

ios - 拍摄照片时未使用 AVCaptureDevice 的设置

非全屏模式下的 iOS 5 后置摄像头预览

android - Android 上的相机示例

android - Android 设备上的图像旋转问题

c++ - 错误说 “camera is undefined”,但我确实定义了它

android - 从 Android 应用向 Google Assistant 发送命令

android - SIP在android上注册两次

java - 在 Android 中使用模块化

java - 绘制多个对象 - Android

android - 使用 ImageLoader 从 AWS url android 下载图像