簡體   English   中英

發生NullPointerException嘗試在空對象引用上調用虛擬方法

[英]occur NullPointerException Attempt to invoke virtual method on a null object reference

我嘗試在樹莓派Android上測試USB攝像頭預覽。

首先,我的樹莓派是手臂處理器。

和USB攝像頭不是問題的設備。

在我檢查了是否發生NullPointerException ,請嘗試進行null檢查

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 {
      }
  }
 }

此代碼成功在其他設備上工作。 (不是樹莓派),只有樹莓派設備會發生異常

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)

也許,樹莓派android的不同相機打開了嗎? 如果你知道的話。 請給我建議

謝謝。

CameraJavadocs說:

API級別21中不推薦使用該類。

我們建議對新的應用程序使用新的android.hardware.camera2 API。

open()的javadoc說:

創建一個新的Camera對象,以訪問設備上的第一個背面攝像頭。 如果設備沒有后置攝像頭,則返回null。

因此,有許多可能的解釋:

  • 您的設備沒有后置攝像頭。
  • 設備的后置攝像頭在某種程度上在Raspberry Pi的OS級別上配置不當...導致Android無法找到或無法使用它。
  • Raspberry Pi Android上未正確實現此不推薦使用的API。

我建議您按照javadoc的說明進行操作,然后重新編碼以使用camera2 API。 然后進行調試

如果無法使用camera2 API,則可能需要使用getNumberOfCamerasgetCameraInfo(...)來確定要使用的攝像機,然后調用open(ID)打開選定的攝像機。 (實際上,僅調用並顯示getNumberOfCameras會有所幫助。)

更新

經過進一步的挖掘,我認為答案是,Android Raspberry Pi上的相機支持相當粗糙。 例如:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM