2013-05-05 9 views
6

Ich habe versucht, Kamera im Hintergrund eines Dienstes zu laufen. Ich habe die in How to use Camera to take picture in a background Service on Android?, Taking picture from camera without preview gezeigte Methode verfolgt. Dies ist, was ichAndroid Kamera - im Hintergrund von Service

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> 

Ist diese Art und Weise richtig gemacht? Und das Hauptproblem, mit dem ich konfrontiert bin, ist, dass es keinen Fehler gibt und dass kein Logout kommt. So kann ich nicht herausfinden, was das Problem verursacht, aber das Video wird nicht aufgezeichnet. Kann mich bitte jemand korrigieren?

Vielen Dank im Voraus

Antwort

0

Try-Service Kontext verwenden, rufen startrecording

vRecorder.startRecording(this); 

Sie vermeiden sollten Application Ansichten erstellen verwenden. Ich habe ein ähnliches Problem, als ich versuchte, AlertDialog basierend auf ApplicationContext zu erstellen. Es wurden keine Fehler angezeigt, aber der Dialog wurde angezeigt.

Hofft es hilft!

Verwandte Themen