Azlam
Azlam

Reputation: 2082

Record Video in a Service

Is it possible to record video in a service, that is without setting the setPreviewDisplay? I tried it on a HTC Desire, however it is throwing this info in the log,

MediaRecorder Prepare Failed: -1

CameraInput No surface is available for display

Is there some additional properties to be set?

Upvotes: 1

Views: 2332

Answers (3)

vamshi palutla
vamshi palutla

Reputation: 104

public class RecorderService extends Service { private static final String TAG = "RecorderService"; private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; private static Camera mServiceCamera; private boolean mRecordingStatus; private MediaRecorder mMediaRecorder; private File filefolder; private String strphoto; private File photo;

@Override
public void onCreate() {
    mRecordingStatus = false;
    //mServiceCamera = CameraRecorder.mCamera;
    mServiceCamera = Camera.open();
    mSurfaceView = CameraRecorder.mSurfaceView;
    mSurfaceHolder = CameraRecorder.mSurfaceHolder;

    super.onCreate();
    if (mRecordingStatus == false)
        startRecording();
}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onDestroy() {
    stopRecording();
    mRecordingStatus = false;

    super.onDestroy();
}   

public boolean startRecording(){
    try {
        Toast.makeText(getBaseContext(), "Recording Started", Toast.LENGTH_SHORT).show();

        //mServiceCamera = Camera.open();
        Camera.Parameters params = mServiceCamera.getParameters();
        mServiceCamera.setParameters(params);
        Camera.Parameters p = mServiceCamera.getParameters();

        final List<Size> listSize = p.getSupportedPreviewSizes();
        Size mPreviewSize = listSize.get(2);
        Log.v(TAG, "use: width = " + mPreviewSize.width 
                    + " height = " + mPreviewSize.height);
        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);
        if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
        {
             filefolder=new File(android.os.Environment.getExternalStorageDirectory(),"Backgroundcamera/videos");
        }
        else
        {
            filefolder=RecorderService.this.getCacheDir();
        }
         if(!filefolder.exists())
            filefolder.mkdirs();
        strphoto     = System.currentTimeMillis()+".mp4";
        mMediaRecorder.setOutputFile(filefolder+"/"+strphoto);
        mMediaRecorder.setVideoFrameRate(30);
        mMediaRecorder.setVideoSize(mPreviewSize.width, mPreviewSize.height);
        mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());

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

        mRecordingStatus = true;

        return true;
    } catch (IllegalStateException e) {
        Log.d(TAG, e.getMessage());
        e.printStackTrace();
        return false;
    } catch (IOException e) {
        Log.d(TAG, e.getMessage());
        e.printStackTrace();
        return false;
    }
}

public void stopRecording() {
    Toast.makeText(getBaseContext(), "Recording Stopped", Toast.LENGTH_SHORT).show();
    try {
        mServiceCamera.reconnect();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    mMediaRecorder.stop();
    mMediaRecorder.reset();

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

    mServiceCamera.release();
    mServiceCamera = null;
}

} and

start the service on a click listerner.

Upvotes: 0

James Hornitzky
James Hornitzky

Reputation: 11

I found this snippet somewhere. Not sure if it works for media recorder, but it was working reasonably well for camera.takePicture on HTC hero android 2.1-update1 (and simulator).

if (camera == null) {
    Log.i(TAG, "Opening camera");
    camera = Camera.open();
}

SurfaceView view = new SurfaceView(new DummyContext()); //You'll have to create your own class extending Context
camera.setPreviewDisplay(view.getHolder());
camera.startPreview();

//wait
Log.i(TAG, "Wait for cam");
    try {
    Thread.sleep(2000);
} catch (InterruptedException e) {
    Log.e(TAG, "Woken violently");
    e.printStackTrace();
}

//take pic
Log.i(TAG, "Take pic");
camera.takePicture(shutterCallback, rawCallback, jpegCallback); 

Upvotes: 1

Greg Giacovelli
Greg Giacovelli

Reputation: 10184

I believe according to the docs

public final void setPreviewDisplay (SurfaceHolder holder)

Since: API Level 1 Sets the Surface to be used for live preview. A surface is necessary for preview, and preview is necessary to take pictures. The same surface can be re-set without harm.

I know you are desiring to take video but, I take this to me any camera usage requires a surface.

Upvotes: 0

Related Questions