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