title: Android Camera - Running in background from service
body: <p>I have been trying to run camera in background of a service. I have followed the method shown in <a href="https://stackoverflow.com/questions/7398897/how-to-use-camera-to-take-picture-in-a-background-service-on-android">How to use Camera to take picture in a background Service on Android?</a> , <a href="https://stackoverflow.com/questions/2386025/android-camera-without-preview">Taking picture from camera without preview</a>. This is what I have done</p>
  
  <p>ExperimentalControl.java</p>
  
  <pre><code>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;
       }
  
  }
  </code></pre>
  
  <p>VideoRecorder.java</p>
  
  <pre><code>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;
      }
  }
  </code></pre>
  
  <p>Manifest.xml</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.test2"
      android:versionCode="1"
       android:versionName="1.0" &gt;
  
  &lt;uses-sdk
      android:minSdkVersion="8"
      android:targetSdkVersion="17" /&gt;
  
  &lt;uses-feature android:name="android.hardware.camera" /&gt;
  &lt;uses-permission android:name="android.permission.RECORD_AUDIO" /&gt;
  &lt;uses-permission android:name="android.permission.CAMERA"/&gt;
  &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt;
  &lt;uses-permission android:name="android.permission.INTERNET"/&gt;
  &lt;uses-feature android:name="android.hardware.camera.autofocus" /&gt;
  
  &lt;application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" &gt;
      &lt;service android:name=".ExperimentControl" /&gt;
  &lt;/application&gt;
  
  &lt;/manifest&gt;
  </code></pre>
  
  <p>Is this way correct? And the main problem I am facing is this doesnot show any error nor log ouput is coming.So I am unable to get to identify what is causing the problem but the video is not recorded. Can anybody please correct me?</p>
  
  <p>Thanks in advance</p>