2013-03-03 3 views
0

onPreviewFrame (byte [] 데이터, 카메라 카메라)에서 데이터를 가져 오려고합니다. 그러나 그것은 작동하지 않는 것 같습니다. 이 코드에 문제가 있습니까? 이것의 대부분은 여기카메라에서 Android 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; 
     } 
    } 
} 

http://developer.android.com/training/camera/cameradirect.html에서 바로 온 것은 내 미리보기 클래스 다음

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, 카메라 카메라)에 중단 점을 넣었지만 절대로 충돌하지 않습니다.

답변

0

다음 지침을 따르십시오. http://developer.android.com/guide/topics/media/camera.html#custom-camera 문제는 내가 활동을 작성하지 않고 있다는 것입니다. 이 서비스를 실행하고 화면이 꺼져 있어도이 정보를 얻을 수 있기를 바랍니다. 그 방법을 모릅니다.

+0

보안상의 이유 때문에 아마도 가능하지 않습니다. 이미지가 실제로 표면에 보이지 않는 한 포어 그라운드 활동으로 캡처 할 수도 없습니다. –

+0

@rickster 나는 너와 같은 문제가있어, onpreviewframe이 불리지 않았고, 어떤 해결책이 있니? [내 문제] (http://stackoverflow.com/q/29310279/4388898) –

0

setPreviewCallback 대신 setPreviewCallbackWithBuffer (Camera.PreviewCallback cb)을 사용해야합니다. 그리고 addCallbackBuffer(byte[])

을 사용하여 콜백 버퍼를 추가하십시오. addCallbackBuffer(byte[])을 사용하면 바이트 길이가 미리보기 크기 (너비 * 높이)보다 큽니다. 그러면 onPreviewFrame 방법으로 데이터를 가져올 수 있다고 생각합니다.

관련 문제