2013-03-03 32 views
0

我試圖從onPreviewFrame(byte [] data,Camera camera)獲取數據。但它似乎並沒有工作。你看到這個代碼有什麼問題嗎?這其中大部分剛剛直起http://developer.android.com/training/camera/cameradirect.htmlAndroid onPreviewFrame回調未獲取相機

public class UAVCamera extends Thread { 

    Camera mCamera; 
    CameraPreview mPreview; 

    public UAVCamera(Context context) { 
     mPreview = new CameraPreview(context); 
    } 

    @Override 
    public void run() { 
     safeCameraOpen(); 
     mPreview.setCamera(mCamera); 
    } 

    private boolean safeCameraOpen() { 
     boolean qOpened = false; 

     try { 
      releaseCameraAndPreview(); 
      mCamera = Camera.open(); 
      qOpened = (mCamera != null); 
     } catch (Exception e) { 
      //Log.e(getString(R.string.app_name), "failed to open Camera"); 
      e.printStackTrace(); 
     } 

     return qOpened;  
    } 

    private void releaseCameraAndPreview() { 
     mPreview.setCamera(null); 
     if (mCamera != null) { 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 
} 

這裏是我的預覽類

class CameraPreview extends ViewGroup implements SurfaceHolder.Callback { 

    SurfaceView mSurfaceView; 
    SurfaceHolder mHolder; 
    Camera mCamera; 

    CameraPreview(Context context) { 
     super(context); 

     mSurfaceView = new SurfaceView(context); 
     addView(mSurfaceView); 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = mSurfaceView.getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    private void stopPreviewAndFreeCamera() { 

     if (mCamera != null) { 
      /* 
       Call stopPreview() to stop updating the preview surface. 
      */ 
      mCamera.stopPreview(); 

      /* 
       Important: Call release() to release the camera for use by other applications. 
       Applications should release the camera immediately in onPause() (and re-open() it in 
       onResume()). 
      */ 
      mCamera.release(); 

      mCamera = null; 
     } 
    } 

    public void setCamera(Camera camera) { 
     if (mCamera == camera) { return; } 

     stopPreviewAndFreeCamera(); 

     mCamera = camera; 

     if (mCamera != null) { 

      try { 
       mCamera.setPreviewDisplay(mHolder); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      /* 
       Important: Call startPreview() to start updating the preview surface. Preview must 
       be started before you can take a picture. 
       */ 
      mCamera.startPreview();    
      mCamera.setPreviewCallback(new PreviewCallback() { 

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

        } 
       }); 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) { 
     // TODO Auto-generated method stub 

    } 
} 

這裏是我的活動

public class MainActivity extends Activity { 

    private UAVCamera uavCamera;  

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     uavCamera = new UAVCamera(this); 
     uavCamera.start(); 
    }       
} 

我真的甚至不需要顯示圖片用戶。我只需要查看數據。有可能這樣做嗎?我在onPreviewFrame(byte [] data,Camera camera)上放置了一個斷點,但它永遠不會被擊中。

回答

0

我按照指示http://developer.android.com/guide/topics/media/camera.html#custom-camera 問題是我沒有創建一個活動。我想將此作爲服務運行,即使屏幕不顯示,也能夠獲取此信息。不知道該怎麼做。

+0

由於其他安全原因,這是不可能的。你甚至不能捕捉到前景的活動,除非圖像實際顯示在表面上。 – 2013-03-05 00:22:26

+0

@rickster我有像你一樣的問題,onpreviewframe沒有調用,有任何解決方案? [我的問題](http://stackoverflow.com/q/29310279/4388898) – 2015-03-30 03:59:00

0

您應該使用 setPreviewCallbackWithBuffer (Camera.PreviewCallback cb)而不是setPreviewCallback。 並添加回調緩衝區使用addCallbackBuffer(byte[])

當您使用addCallbackBuffer(byte[])時,字節長度超過預覽大小(寬*高)。 然後,我認爲你可以在onPreviewFrame方法中獲取數據。

相關問題