如何使这个Android应用程序记录视频而无需用户按下按钮?

时间:2015-06-12 17:01:44

标签: android android-mediarecorder

我有一个可以无限制地录制视频的应用程序,但最好能够开始录制而无需用户点击按钮。

然而,当我使用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();
}

0 个答案:

没有答案