2013-02-20 15 views
13

Chcesz zbudować aplikację, która utrzymuje nagrywanie w tle, czy to możliwe?Otwórz/uruchom kamerę z usługi w tle w Androidzie

+0

cóż, nie jestem tego pewien, ale wiem, że możesz używać metody nagrywania w metodzie onPause(), więc gdy jesteś w tle, będziesz nagrywał. i przy okazji co próbowaliście? – k0sh

+0

myślisz, że to możliwe i czy zrobiłeś to samo, jeśli inna aplikacja lub domyślna aplikacja kamery prosi o aparat? czy pokaże aparat, który jest już w użyciu? czy to nie szpiegowanie nie jest dobrym nawykiem? –

Odpowiedz

13

Tak, bardzo możliwe.

Utwórz działanie, które uruchomi usługę tła w przypadku niektórych zdarzeń lub możesz użyć menedżera alarmów, aby uruchomić i zatrzymać usługę zgodnie z wymaganiami.

Sprawdź kod, który rozpocznie się & zatrzymać nagrywanie za pomocą kamery, to można zadzwonić z usług w tle i będzie działać sprawnie.

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

To jest przykładowy kod, należy dodać własną logikę i obsługiwać również wyjątki.

+0

dzięki za szybką odpowiedź. Próbowałem tego i działało po drobnych zmianach. – DraD

+4

co to jest mSurfaceHolder w twoim przykładzie? Jeśli używam pustego, dostaję błąd na jakimś urządzeniu i nie mogę go dostać, jeśli korzystam tylko z usługi –

+3

Ten kod działa poprawnie na Androidzie 2.3.3 HTC Desire, ale nagrywanie w tle kończy się niepowodzeniem w Galaxy S3 i Nexus 4. Jakieś pomysły? – Sergii

Powiązane problemy