发生NullPointerException尝试在空对象引用

时间:2016-10-26 01:14:32

标签: java android linux camera

我尝试在覆盆子安卓上测试usb相机预览。

首先,我的树莓派是手臂处理器。

和usb相机没问题设备。

我检查后发生NullPointerException,尝试空检查

Log.d(TAG,"Camera is connected?"+camera);
结果是Camera is connected?null

所以,我认为raspberry pi是 似乎无法察觉。

MainActivity.class

public class MainActivity extends Activity implements SurfaceHolder.Callback {
     Camera camera;
     SurfaceView surfaceView;
     SurfaceHolder surfacehHolder;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
     .
     .
     getWindow().setFormat(PixelFormat.UNKNOWN);

     surfaceView = (SurfaceView)findViewById(R.id.surfaceView);
     surfaceHolder = surfaceView.getHolder();
     surfaceHolder.addCallback(this);
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
     }

     @Override
     public void surfaceCreated(SurfaceHolder holder) {

     camera = Camera.open();
     camera.stopPreview();
     Camera.Parameters param = camera.getParameters();
     param.setRotation(90);
     camera.setParameters(param);

     try {
         camera.setPreviewDisplay(surfaceHolder);
         camera.startPreview();
     } catch {
        return;
     }
  }

  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
       refreshCamera();
  }

  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
       camera.stopPreview();
       camera.release();
       camera = null;
  }

  public void refreshCamera() {
      if (surfaceHolder.getSurface() = null) {
         return ;
      } 
      try {
          camera.stopPreview();
      } catch {
      }
  }
 }

此代码成功在不同的设备中工作。 (不是覆盆子pi) 但只有覆盆子pi设备,发生异常

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.Camera.stopPreview()' on a null object reference
at kr.c004245.dom.camera_raspberry_preview.MainActivity.surfaceCreated(MainActivity.java:134)
at android.view.SurfaceView.updateWindow(SurfaceView.java:583)
at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:177)
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2063)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1115)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6023)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
at android.view.Choreographer.doCallbacks(Choreographer.java:670)
at android.view.Choreographer.doFrame(Choreographer.java:606)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5488)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
也许,覆盆子pi android不同的相机打开? 如果你知道的话。请给我建议

感谢。

1 个答案:

答案 0 :(得分:1)

Camera的{​​{3}}说:

  

此类在API级别21中已弃用。

     

我们建议您为新应用程序使用新的android.hardware.camera2 API。

open()的javadoc说:

  

创建一个新的Camera对象以访问设备上的第一个后置摄像头。 如果设备没有后置摄像头,则返回null。

所以有很多可能的解释:

  • 您的设备没有背面相机。
  • 您的设备的后置摄像头在Raspberry Pi上的操作系统级别出现了错误的配置... Android无法找到它,或者无法使用它。
  • 在Raspberry Pi Android上未正确实施此弃用的API。

我建议您执行javadoc所说的内容,并重新编码以使用camera2 API。然后继续调试那个

如果您无法使用camera2 API,则可能需要使用getNumberOfCamerasgetCameraInfo(...)来确定要使用的相机,然后致电{ {1}}打开所选摄像机。 (实际上,只是调用和显示open(ID)会有所帮助。)

<强>更新

经过多次挖掘后,我认为答案是Android Raspberry Pi上的相机支持非常粗糙。例如: