我有一个可以无限制地录制视频的应用程序,但最好能够开始录制而无需用户点击按钮。
然而,当我使用performClick()或将onClick()代码移动到onCreate()时,它会抛出错误
"E/MediaRecorder﹕ start called in an invalid state: 4"
然后它等我点击按钮。
这是某种安全限制吗?有什么办法解决吗? 电话根植于此。
public class VideoRecorder extends Activity implements OnClickListener, SurfaceHolder.Callback {
MediaRecorder mRecorder;
SurfaceHolder mHolder;
boolean mRecording = false;
boolean mStop = false;
boolean mPrepared = false;
boolean mLoggedIn = false;
private PowerManager.WakeLock mWakeLock;
private ArrayList<String> mFiles = new ArrayList<String>();
private Timer mStopTimer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags( WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON );
mRecorder = new MediaRecorder();
initRecorder();
setContentView(R.layout.main);
SurfaceView cameraView = (SurfaceView) findViewById(R.id.surface_camera);
mHolder = cameraView.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
cameraView.setClickable(true);
cameraView.setOnClickListener(this);
cameraView.performClick();
}
@Override
protected void onDestroy() {
try {
super.onDestroy();
//Logger.Debug("onStop");
mWakeLock.release();
//logOut();
}
catch (Exception e) {
//Logger.Error( "VideoRecorderTest_onStop", e );
}
}
@Override
public void onResume() {
super.onResume();
}
private void initRecorder() {
mRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mRecorder.setMaxDuration((int) 60000);
mRecorder.setVideoSize(320, 240);
mRecorder.setVideoFrameRate(15);
File mediaStorageDir = new File("/sdcard/Surveillance/");
if ( !mediaStorageDir.exists() ) {
if ( !mediaStorageDir.mkdirs() ){
//Logger.Debug("failed to create directory");
}
}
String filePath = "/sdcard/Surveillance/" + "VID_"+ new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + ".mp4";
mFiles.add(filePath);
mRecorder.setOutputFile(filePath);
}
private void prepareRecorder() {
//Logger.Debug( "About to prepare" );
mRecorder.setPreviewDisplay(mHolder.getSurface());
try {
mRecorder.prepare();
mPrepared = true;
//Logger.Debug( "right after prepare");
} catch (IllegalStateException e) {
//Logger.Error("prepareRecorder_IllegalStateException", e);
//finish();
} catch (IOException e) {
//Logger.Error("prepareRecorder_IOException", e);
//finish();
} catch( Exception e) {
//Logger.Error("prepareRecorder", e);
}
//Logger.Debug("after prepare");
}
public void onClick(View v) {
try {
if (mRecording) {
//Logger.Debug("Stopping");
mRecorder.reset();
mPrepared = false;
mRecording = false;
this.initRecorder();
this.prepareRecorder();
mStopTimer.cancel();
}
else {
//prepareRecorder();
mRecorder.start();
mRecording = true;
mStopTimer = new Timer();
mStopTimer.schedule( new TimerTask() {
@Override
public void run() {
Looper.prepare();
restartRecorder();
}
}, 60 * 1000 );
}
}
catch (Exception e) {
//Logger.Error( "onClick", e );
}
}
public void init() {
try {
if (mRecording) {
//Logger.Debug("Stopping");
mRecorder.reset();
mPrepared = false;
mRecording = false;
this.initRecorder();
this.prepareRecorder();
mStopTimer.cancel();
}
else {
//prepareRecorder();
mRecorder.start();
mRecording = true;
mStopTimer = new Timer();
mStopTimer.schedule( new TimerTask() {
@Override
public void run() {
Looper.prepare();
restartRecorder();
}
}, 60 * 1000 );
}
}
catch (Exception e) {
//Logger.Error( "onClick", e );
}
}
public void restartRecorder() {
//Logger.Debug("'bout to restart recorder");
mRecorder.reset();
mPrepared = false;
mRecording = false;
initRecorder();
prepareRecorder();
//UPLOAF
mRecorder.start();
mRecording = true;
mStopTimer = new Timer();
mStopTimer.schedule( new TimerTask() {
@Override
public void run() {
Looper.prepare();
restartRecorder();
}
}, 60 * 1000 );
}
public void surfaceCreated(SurfaceHolder holder) {
if( !mPrepared ) {
prepareRecorder();
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
//camera.setPreview();
}
public void surfaceDestroyed(SurfaceHolder holder) {
if (mRecording) {
mRecorder.stop();
mRecording = false;
//mRecorder.release();
}
mRecorder.release();
}