2013-10-09 3 views
10

저는 현재 백그라운드에서 비디오를 녹화하고 처리해야하는 앱을 개발 중입니다. 백그라운드에서 Android 카메라를 사용하는 방법은 무엇인가요?

그러나

이 그것을 달성하기 위해, 내가 서비스로 카메라와 OpenCV의를 사용해야합니다 (그것은 미리보기 데이터 이미지 프로세스를 백그라운드에서 카메라 미리보기 데이터를 실시간으로 얻을 가질 필요), 그것은 보인다 OpenCV 및 Android.Hardware.Camera에서 JavaCameraView를 사용할 수 없습니다. 미리보기를 사용하지 않아도됩니다.

내 질문 사항은 다음과 같습니다.

  1. OpenCV의 NativeCamera를이 용도로 사용할 수 있다고 들었습니다. 가능한가? (아마도 예를 들어?)

  2. 이 목적을 위해 JavaCameraView (또는 비슷한 물건)를 사용할 수있는 방법이 있습니까? 현재 갤럭시 S4를 사용하고 있습니다.

  3. 은 안드로이드가 (미리보기를 사용하지 않고 데이터를 어떤 표면보기없이 카메라 미리보기를 사용하거나 프로세스 카메라)? 등의 메소드를 지원하지 않는 경우이 가능한 해결 방법을인가 안드로이드하지 않는 이유 (선택 사항)

  4. 그러한 작업을 지원합니까? 그것은 매우 짜증나!

질문에 답변 해 주셔서 감사합니다.

+0

나는 지금 당신과 같은 상황입니다. 해결책이있어? –

+0

[백그라운드 서비스 내에서 안드로이드 사용 카메라]의 가능한 복제본 (http://stackoverflow.com/questions/6901542/android-use-camera-from-within-background-service) –

+1

https://github.com/ kevalpatel2106/android-hidden-camera -이 라이브러리는 백그라운드에서 이미지를 캡처하는 쉬운 인터페이스를 제공합니다. –

답변

0

서비스를 사용하여 백그라운드에서 카메라를 시작할 수 있습니다. this을 참조 할 수 있습니다. 희망이 당신을 도울 것입니다.

+0

문제는 카메라에서 서비스를 구현하는 데 일반적으로 사용되는 방법이 작동하지 않는다는 것입니다. – EngineerCat

+0

많은 사람들이 Dummy Surfaceview를 사용하거나, 표면보기를 사실상 보이지 않게 (아주 아주 작게) 만들 것을 제안했지만 더미 표면을 내 장치에 적용하지 못했습니다. 또한 다른 앱을 통해 서핑해도 카메라가 작동해야하므로 (모션 기반 UI 용도로 적용하기 위해) 카메라를 작동시켜야하므로 표면 뷰를 사용할 수 없으며 크기에 관계없이 표면 뷰가 발생합니다) 파괴 될 것이다. – EngineerCat

2

예는 다음 단계를 수 ..

일부 이벤트에 백그라운드 서비스를 시작 한 활동을 만들거나 당신은 또한 시작하고 요구 사항에 따라 서비스를 중지 알람 매니저를 사용할 수 있습니다.

다음 코드를 참조하십시오.

public boolean starMediaRecording(){ 
     Camera.Parameters params = mServiceCamera.getParameters(); 
     mServiceCamera.setParameters(params); 
     Camera.Parameters p = mServiceCamera.getParameters(); 

     final List<Size> listSize = p.getSupportedPreviewSizes(); 
     Size mPreviewSize = listSize.get(2); 
     p.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
     p.setPreviewFormat(PixelFormat.YCbCr_420_SP); 
     mServiceCamera.setParameters(p); 

     try { 
      mServiceCamera.setPreviewDisplay(mSurfaceHolder); 
      mServiceCamera.startPreview(); 
     } 
     catch (IOException e) { 
      Log.e(TAG, e.getMessage()); 
      e.printStackTrace(); 
     } 

     mServiceCamera.unlock(); 

     mMediaRecorder = new MediaRecorder(); 
     mMediaRecorder.setCamera(mServiceCamera); 
     mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
     mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
     mMediaRecorder.setOutputFile("/sdcard/filenamevideo.mp4"); 
     mMediaRecorder.setVideoFrameRate(30); 
     mMediaRecorder.setVideoSize(mPreviewSize.width, mPreviewSize.height); 
     mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 

     mMediaRecorder.prepare(); 
     mMediaRecorder.start(); 

     mRecordingStatus = true; 

     return true; 

} 

public void stopMediaRecorder() { 
    mServiceCamera.reconnect(); 

    mMediaRecorder.stop(); 
    mMediaRecorder.reset(); 

    mServiceCamera.stopPreview(); 
    mMediaRecorder.release(); 

    mServiceCamera.release(); 
    mServiceCamera = null; 
    } 
} 
관련 문제