Android Camera:尝试在空对象引用上调用 android.hardware.Camera.getParameters()' 上的虚拟方法 Android Camera Parameters

Posted

技术标签:

【中文标题】Android Camera:尝试在空对象引用上调用 android.hardware.Camera.getParameters()\' 上的虚拟方法 Android Camera Parameters【英文标题】:Android Camera: Attempt to invoke virtual method Android Camera Parameters on android.hardware.Camera.getParameters()' on a null object referenceAndroid Camera:尝试在空对象引用上调用 android.hardware.Camera.getParameters()' 上的虚拟方法 Android Camera Parameters 【发布时间】:2017-04-22 11:46:28 【问题描述】:

我使用我的Fabric-service 并在大多数运行我的应用程序的设备上发现了这个错误。

错误是这样的:

致命异常:java.lang.NullPointerException 尝试调用 虚拟方法'android.hardware.Camera$Parameters android.hardware.Camera.getParameters()' 在空对象引用上

这是我的代码:

 public class CameraActivity extends Activity implements SurfaceHolder.Callback

    android.hardware.Camera camera;
    int moi = 0;
    @InjectView(R.id.s)
    SurfaceView surfaceView;

    @InjectView(R.id.takeaphoto)
    ImageView imageView;
    SurfaceHolder surfaceHolder;
    private Camera.Face[] mFaces;





    // Draw rectangles and other fancy stuff:
    private FaceOverlayView mFaceView;
    private int mOrientation;
    private float x1,x2;
    static final int MIN_DISTANCE = 150;
    private int mOrientationCompensation;
    private OrientationEventListener mOrientationEventListener;

    // Let's keep track of the display rotation and orientation also:
    private int mDisplayRotation;
    private int mDisplayOrientation;


    Camera.PictureCallback callback;
    int cameraId = 0;
    Camera.ShutterCallback shutterCallback;

    private Camera.FaceDetectionListener faceDetectionListener = new Camera.FaceDetectionListener() 
        @Override
        public void onFaceDetection(Camera.Face[] faces, Camera camera) 
            Log.d("onFaceDetection", "Number of Faces:" + faces.length);
            // Update the view now!
            mFaceView.setFaces(faces);
        

    ;



    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        Fabric.with(this, new Crashlytics());
        Fabric.with(this, new Answers());
        setContentView(R.layout.camera_activity);

        mFaceView = new FaceOverlayView(this);
        addContentView(mFaceView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        // Create and Start the OrientationListener:
        mOrientationEventListener = new SimpleOrientationEventListener(this);
        mOrientationEventListener.enable();


        SharedPreferences pap = this.getSharedPreferences(
                "AD1", Context.MODE_PRIVATE);
        boolean frr = pap.getBoolean("fr", false);

        if (!frr) 

            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Tip");
            builder.setMessage("Use the beautiful filters by swiping from right to left")
                    .setCancelable(true)
                    .setPositiveButton("Ok", new DialogInterface.OnClickListener() 
                        @Override
                        public void onClick(DialogInterface dialog, int which) 

                            SharedPreferences e = getApplicationContext().getSharedPreferences(
                                    "AD1", Context.MODE_PRIVATE);
                            SharedPreferences.Editor d = e.edit();
                            d.putBoolean("fr", true);
                            d.commit();

                        

                    );


            AlertDialog alert = builder.create();
            alert.show();


         else 


        



        ButterKnife.inject(this);
        surfaceHolder=surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        imageView.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
cameraImage();
            
        );
        callback = new android.hardware.Camera.PictureCallback() 
            @Override
            public void onPictureTaken(byte[] bytes, android.hardware.Camera camera) 
                FileOutputStream outputStream=null;
                File file_image = getDirc();

                SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyymmddhhmms");
                String date = simpleDateFormat.format(new Date());
                String photo_file="PI_"+date+".jpg";
                String file_name = file_image.getAbsolutePath()+"/"+photo_file;
                File picfile=new File(file_name);

                try 

                    outputStream=new FileOutputStream(picfile);
                    outputStream.write(bytes);
                    outputStream.close();


                catch (FileNotFoundException e)
                catch (IOException ex)
                finally 

                
                refreshCamera();
                refreshGallery(picfile);

                try 
                    camera.stopPreview();
                catch (Exception e)

                try

                    camera.setPreviewDisplay(surfaceHolder);
                    camera.startPreview();
                catch (Exception e)


            


        ;


        








    private void refreshGallery(File file)
        Intent intent=new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        intent.setData(Uri.fromFile(file));



    

    public void refreshCamera()

        if (surfaceHolder.getSurface() == null)

            return;

        

    


    private class SimpleOrientationEventListener extends OrientationEventListener 

        public SimpleOrientationEventListener(Context context) 
            super(context, SensorManager.SENSOR_DELAY_NORMAL);
        

        @Override
        public void onOrientationChanged(int i) 
            // We keep the last known orientation. So if the user first orient
            // the camera then point the camera to floor or sky, we still have
            // the correct orientation.
            if (orientation == ORIENTATION_UNKNOWN) return;
            mOrientation = Util.roundOrientation(orientation, mOrientation);
            // When the screen is unlocked, display rotation may change. Always
            // calculate the up-to-date orientationCompensation.
            int orientationCompensation = mOrientation
                    + Util.getDisplayRotation(CameraActivity.this);
            if (mOrientationCompensation != orientationCompensation) 
                mOrientationCompensation = orientationCompensation;
                mFaceView.setOrientation(mOrientationCompensation);
            
        

    


        private File getDirc()

File dics = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
        return new File(dics ,"Camera");

    

    public void cameraImage()

        camera.takePicture(null , null ,callback);
       MediaPlayer mediaPlayer = MediaPlayer.create(this , R.raw.sound);
        mediaPlayer.start();

    


    public void surfaceCreated(SurfaceHolder surfaceHolder ) 



try 
    camera = android.hardware.Camera.open();
catch (RuntimeException ex)
        android.hardware.Camera.Parameters parameters;
        parameters = camera.getParameters();
        camera.setFaceDetectionListener(faceDetectionListener);
        camera.startFaceDetection();
        parameters.setPreviewFrameRate(20);
        List<Camera.Size> customSizes = parameters.getSupportedPreviewSizes();
        Camera.Size customSize = customSizes.get(0); //Added size
        parameters.setPreviewSize(customSize.width, customSize.height);
                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
        camera.setParameters(parameters);
        camera.setDisplayOrientation(90);


        try 

            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();


        catch (Exception e)



        

    

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) 
        refreshCamera();
        setDisplayOrientation();

    

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) 
        camera.stopPreview();
        camera.release();
        camera=null;

    

    public void frontCamera(View view) 

        camera.stopPreview();
        camera.release();
        camera=null;

        if (cameraId == 0)


            try 
                camera = android.hardware.Camera.open(1);
            catch (RuntimeException ex)
            android.hardware.Camera.Parameters parameters;
            camera.setFaceDetectionListener(faceDetectionListener);
            camera.startFaceDetection();
            parameters = camera.getParameters();
            parameters.setPreviewFrameRate(20);
            List<Camera.Size> customSizes = parameters.getSupportedPreviewSizes();


            Camera.Size customSize = customSizes.get(0); //Added size
            parameters.setPreviewSize(customSize.width, customSize.height);
            parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
            camera.setParameters(parameters);
            camera.setDisplayOrientation(90);

            cameraId = 1;


            try 

                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();


            catch (Exception e)



            
        

        else

            try 
                camera = android.hardware.Camera.open();
            catch (RuntimeException ex)
            android.hardware.Camera.Parameters parameters;
            camera.setFaceDetectionListener(faceDetectionListener);
            camera.startFaceDetection();
            parameters = camera.getParameters();
            parameters.setPreviewFrameRate(20);
            List<Camera.Size> customSizes = parameters.getSupportedPreviewSizes();


            Camera.Size customSize = customSizes.get(0); //Added size
            parameters.setPreviewSize(customSize.width, customSize.height);
            parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
            camera.setParameters(parameters);
            camera.setDisplayOrientation(90);

            cameraId = 0;

            try 

                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();


            catch (Exception e)



            

        
        

    private void setDisplayOrientation() 
        // Now set the display orientation:
        mDisplayRotation = Util.getDisplayRotation(CameraActivity.this);
        mDisplayOrientation = Util.getDisplayOrientation(mDisplayRotation, 0);

        camera.setDisplayOrientation(mDisplayOrientation);

        if (mFaceView != null) 
            mFaceView.setDisplayOrientation(mDisplayOrientation);
        
    

这是我的清单:

  <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="example.camera">

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/pc"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".SplashScreen"
            android:theme="@style/AppTheme"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".CameraActivity"
      android:screenOrientation="portrait"
         >
         </activity>
        <meta-data
            android:name="io.fabric.ApiKey"
            android:value="e7ded6b46068e619fd1d96f6b9eeaac888fe83f5" />
    </application>

    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

【问题讨论】:

What is a NullPointerException, and how do I fix it?的可能重复 try camera = android.hardware.Camera.open(); catch (RuntimeException ex) parameters = camera.getParameters(); 认真的吗? ...如果open() 失败,那么显然camera 将为空 【参考方案1】:

检查您设备中的应用程序Settings,是否已授予所需权限。就我而言,这就是Exception 的原因,我没有从Settings 授予权限。

希望对你有帮助。

【讨论】:

【参考方案2】:

这是你的问题。仅当没有 RuntimeException 时才会实例化您的 camera 对象。因此,如果发生此异常,camera == null;

try 
    camera = android.hardware.Camera.open();
catch (RuntimeException ex)
// Here is your problem. Catching RuntimeException will make camera object null,
// so method 'getParameters();' won't work :)
        android.hardware.Camera.Parameters parameters;
        parameters = camera.getParameters();
        camera.setFaceDetectionListener(faceDetectionListener);
        camera.startFaceDetection();
        parameters.setPreviewFrameRate(20);
        List<Camera.Size> customSizes = parameters.getSupportedPreviewSizes();
        Camera.Size customSize = customSizes.get(0); //Added size
        parameters.setPreviewSize(customSize.width, customSize.height);
                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
        camera.setParameters(parameters);
        camera.setDisplayOrientation(90);


        try 

            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();


        catch (Exception e)



        

    

【讨论】:

是的,之前没注意到,但是去掉try()catch后还是一样的错误;【参考方案3】:
  try 
        camera = android.hardware.Camera.open();
    catch (RuntimeException ex)
   
if(camera != null)
            android.hardware.Camera.Parameters parameters;
            parameters = camera.getParameters();
            camera.setFaceDetectionListener(faceDetectionListener);
            camera.startFaceDetection();
            parameters.setPreviewFrameRate(20);
            List<Camera.Size> customSizes = parameters.getSupportedPreviewSizes();
            Camera.Size customSize = customSizes.get(0); //Added size
            parameters.setPreviewSize(customSize.width, customSize.height);
                    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
            camera.setParameters(parameters);
            camera.setDisplayOrientation(90);


    try 

        camera.setPreviewDisplay(surfaceHolder);
        camera.startPreview();


    catch (Exception e)



    


初始化相机后,您可以放置​​一个简单的 if 条件,您可以在其中检查 if(camera != null) // 参数代码

【讨论】:

以上是关于Android Camera:尝试在空对象引用上调用 android.hardware.Camera.getParameters()' 上的虚拟方法 Android Camera Parameters的主要内容,如果未能解决你的问题,请参考以下文章

尝试在空对象引用上调用虚拟方法 'android.view.SurfaceHolder android.view.SurfaceView.getHolder()'

尝试在空对象引用上调用虚拟方法 'android.graphics.Rect android.graphics.drawable.Drawable.getBounds()'

尝试在空对象引用上调用虚拟方法 'android.view.Window$Callback android.view.Window.getCallback()'

Android错误尝试在空对象引用上调用虚拟方法[重复]

尝试在空对象引用上调用虚拟方法 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()'

JPE:尝试在空对象引用上调用虚拟方法“android.content.res.Resources”