【问题标题】:Attempt to invoke virtual method 'void android.hardware.Camera.stopPreview()' on a null object reference尝试在空对象引用上调用虚拟方法“void android.hardware.Camera.stopPreview()”
【发布时间】:2019-03-29 17:41:33
【问题描述】:

我正在尝试在手机背景上运行摄像机。但是得到以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.Camera.stopPreview()' on a null object reference
    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3230)
    at android.app.ActivityThread.-wrap17(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1590)
    at android.os.Handler.dispatchMessage(Handler.java:111)
    at android.os.Looper.loop(Looper.java:207)
    at android.app.ActivityThread.main(ActivityThread.java:5737)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.Camera.stopPreview()' on a null object reference
    at bd.org.rain.lostphonefinder.CameraService.handleStopRecordingCommand(CameraService.java:241)
    at bd.org.rain.lostphonefinder.CameraService.onStartCommand(CameraService.java:104)
    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3213)
    at android.app.ActivityThread.-wrap17(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1590) 
    at android.os.Handler.dispatchMessage(Handler.java:111) 
    at android.os.Looper.loop(Looper.java:207) 
    at android.app.ActivityThread.main(ActivityThread.java:5737) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 

相机服务类代码:

https://pastebin.com/WKKPafD3

清单:

<uses-feature android:name="android.hardware.camera2.full" />
<uses-feature android:name="android.hardware.camera2.front" android:required="false" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

请帮忙!

【问题讨论】:

标签: android background android-camera


【解决方案1】:

您的问题是 mCamera 对象为 null。简单的解决方法是:

private void handleStopRecordingCommand(Intent intent) {
    ResultReceiver resultReceiver = intent.getParcelableExtra(RESULT_RECEIVER);

    if (!mRecording) {
        // have not recorded
        resultReceiver.send(RECORD_RESULT_NOT_RECORDING, null);
        return;
    }

    try {
        mMediaRecorder.stop();
        mMediaRecorder.release();
    } catch (RuntimeException e) {
        mMediaRecorder.reset();
        resultReceiver.send(RECORD_RESULT_UNSTOPPABLE, new Bundle());
        return;
    } finally {
        mMediaRecorder = null;
        if(mCamera != null) {// This will prevent null pointer exception
            mCamera.stopPreview();
            mCamera.release();
        }
        mRecording = false;
    }

    Bundle b = new Bundle();
    b.putString(VIDEO_PATH, mRecordingPath);
    resultReceiver.send(RECORD_RESULT_OK, b);

    Log.d(TAG, "recording is finished.");
}

【讨论】:

    【解决方案2】:

    试试这个……

    Camera mcamera = Camera.open(0);

    【讨论】:

      【解决方案3】:

      您需要获得相机权限 实现 detrex 库

          implementation 'com.karumi:dexter:4.2.0'
      

      然后在下面获取权限

         Dexter.withActivity(this)
                  .withPermissions(
                          android.Manifest.permission.CAMERA,
      
                          android.Manifest.permission.VIBRATE,
                          android.Manifest.permission.READ_PHONE_STATE)
                  .withListener(new MultiplePermissionsListener() {
                      @Override
                      public void onPermissionsChecked(MultiplePermissionsReport report) {
                          // check if all permissions are granted
                          if (report.areAllPermissionsGranted()) {
                              // do you work now
                          }
      
                          // check for permanent denial of any permission
                          if (report.isAnyPermissionPermanentlyDenied()) {
                              // permission is denied permenantly, navigate user to app settings
                          }
                      }
      
                      @Override
                      public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                          token.continuePermissionRequest();
                      }
                  })
                  .onSameThread()
                  .check();
      

      也将权限粘贴到清单中

      <uses-permission android:name="android.permission.CAMERA" />
      <uses-permission android:name="android.permission.READ_PHONE_STATE" />
      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
      <uses-permission android:name="android.permission.VIBRATE" />
      
      <uses-feature android:name="android.hardware.camera" />
      <uses-feature android:name="android.hardware.camera.autofocus" />
      
      <permission
          android:name="android.permission.FLASHLIGHT"
          android:permissionGroup="android.permission-group.HARDWARE_CONTROLS" />
      enter code here
      

      【讨论】:

        猜你喜欢
        • 2021-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-07
        • 2018-05-22
        相关资源
        最近更新 更多