Cámara Android: se ejecuta en segundo plano desde el servicio

He estado intentando funcionar con la cámara en el fondo de un servicio. He seguido el método que se muestra en Cómo utilizar la cámara para tomar fotos en un servicio de fondo en Android? , Tomar la foto de la cámara sin vista previa . Esto es lo que he hecho

ExperimentalControl.java

package com.example.test2; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; public class ExperimentControl extends Service { VideoRecorder vRecorder; public ExperimentControl() { Log.i("EXPERIMENT","ExperimentControl started!!!"); } @Override public IBinder onBind(Intent intent) { return null; } public int onStartCommand(Intent intent, int flags, int startId) { vRecorder = new VideoRecorder(); vRecorder.startRecording(getApplicationContext()); return START_STICKY; } public void onDestroy() { vRecorder=null; } } 

VideoRecorder.java

 package com.example.test2; import java.io.IOException; import android.content.Context; import android.hardware.Camera; import android.media.MediaRecorder; import android.util.Log; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; public class VideoRecorder implements SurfaceHolder.Callback { String videofolder = android.os.Environment.getExternalStorageDirectory()+"/Record/"; private final String VIDEO_PATH_NAME = videofolder+"test.mp4"; private MediaRecorder mMediaRecorder; private Camera mCamera; private SurfaceView mSurfaceView; private SurfaceHolder mHolder; private boolean mInitSuccesful; void startRecording(Context context) { Log.v("Surya2","here"); mSurfaceView = new SurfaceView(context); mHolder = mSurfaceView.getHolder(); mHolder.addCallback(this); mMediaRecorder.start(); try { Thread.sleep(10 * 1000); } catch (Exception e) { e.printStackTrace(); } //finish(); Log.v("Surya4","here"); } private void initRecorder(Surface surface) throws IOException { if(mCamera == null) { mCamera = Camera.open(); mCamera.unlock(); } if(mMediaRecorder == null) mMediaRecorder = new MediaRecorder(); mMediaRecorder.setPreviewDisplay(surface); mMediaRecorder.setCamera(mCamera); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setVideoEncodingBitRate(512 * 1000); mMediaRecorder.setVideoFrameRate(30); mMediaRecorder.setVideoSize(640, 480); mMediaRecorder.setOutputFile(VIDEO_PATH_NAME); try { mMediaRecorder.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); } mInitSuccesful = true; } @Override public void surfaceCreated(SurfaceHolder holder) { try { Log.v("Surya3","here"); if(!mInitSuccesful) initRecorder(mHolder.getSurface()); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { shutdown(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} private void shutdown() { // Release MediaRecorder and especially the Camera as it's a shared // object that can be used by other applications mMediaRecorder.stop(); mMediaRecorder.reset(); mMediaRecorder.release(); mCamera.release(); // once the objects have been released they can't be reused mMediaRecorder = null; mCamera = null; } } 

Manifest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.test2" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-feature android:name="android.hardware.camera" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-feature android:name="android.hardware.camera.autofocus" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <service android:name=".ExperimentControl" /> </application> </manifest> 

¿Es esto correcto? Y el principal problema que estoy enfrentando es que este doesnot mostrar cualquier error o salida de registro está llegando. Por lo tanto, no puedo llegar a identificar lo que está causando el problema, pero el video no está grabado. ¿Alguien puede corregirme, por favor?

Gracias por adelantado

Intente utilizar el contexto del servicio para llamar a startrecording

 vRecorder.startRecording(this); 

Debe evitar el uso de ApplicationContext para crear vistas. Conseguí problema similar cuando intenté crear AlertDialog basado en ApplicationContext. No se mostraron errores, pero se mostró el diálogo.

¡Esperanzas que ayuda!

  • Implementar receptor de difusión dentro del servicio
  • Lectura de múltiples características de un dispositivo BLE de forma sincrónica (método recomendado para Android)
  • Error en la conexión de Google Analytics con Google para el servicio
  • No se puede resolver Manifest.permission.ACCESS_FINE_LOCATION
  • Una forma correcta de depurar un servicio en Android Studio?
  • Comunicarse desde la aplicación al servicio
  • Diálogo de alerta del servicio de Android
  • Android: servicio destruido cuando se gira la pantalla
  • Android Service preguntas sobre bind / unbind?
  • La aplicación de Android que supervisa las llamadas entrantes mantiene el teléfono despierto
  • Cómo mantener mi servicio de aplicación sigue funcionando incluso si la aplicación está cerrada desde el administrador de tareas en MI teléfono
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.