2013-05-05 8 views
6

Ho cercato di eseguire la fotocamera in background di un servizio. Ho seguito il metodo mostrato in How to use Camera to take picture in a background Service on Android?, Taking picture from camera without preview. Questo è quello che ho fatto- Esecuzione in background dal servizio

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> 

E 'in questo modo corretto? E il problema principale che sto affrontando è che questo non mostra alcun errore, né l'uscita del registro è in arrivo. Così non sono in grado di identificare ciò che sta causando il problema ma il video non è registrato. Qualcuno può correggermi per favore?

Grazie in anticipo

risposta

0

tenta di utilizzare contesto Servizio chiamare startrecording

vRecorder.startRecording(this); 

Si dovrebbe evitare di utilizzare ApplicationContext per creare viste. Ho avuto un problema simile quando ho provato a creare AlertDialog basato su ApplicationContext. Non sono stati mostrati errori ma ora è stato mostrato il dialogo.

Speriamo che aiuti!