在android中从后台服务打开/运行摄像头

在android中从后台服务打开/运行摄像头,android,Android,想建立一个能在后台录制的应用程序,可能吗?是的,很有可能 创建一个活动,该活动将在某些事件中启动后台服务,或者您也可以根据需要使用alarm manager启动和停止服务 检查一些粗略的代码,这将开始和停止使用相机录制,这你可以从你的后台服务调用,并将顺利工作 public boolean starMediaRecording(){ Camera.Parameters params = mServiceCamera.getParameters();

想建立一个能在后台录制的应用程序,可能吗?

是的,很有可能

创建一个活动,该活动将在某些事件中启动后台服务,或者您也可以根据需要使用alarm manager启动和停止服务

检查一些粗略的代码,这将开始和停止使用相机录制,这你可以从你的后台服务调用,并将顺利工作

    public boolean starMediaRecording(){
            Camera.Parameters params = mServiceCamera.getParameters();
            mServiceCamera.setParameters(params);
            Camera.Parameters p = mServiceCamera.getParameters();

            final List<Size> listSize = p.getSupportedPreviewSizes();
            Size mPreviewSize = listSize.get(2);
            p.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
            p.setPreviewFormat(PixelFormat.YCbCr_420_SP);
            mServiceCamera.setParameters(p);

            try {
                mServiceCamera.setPreviewDisplay(mSurfaceHolder);
                mServiceCamera.startPreview();
            }
            catch (IOException e) {
                Log.e(TAG, e.getMessage());
                e.printStackTrace();
            }

            mServiceCamera.unlock();

            mMediaRecorder = new MediaRecorder();
            mMediaRecorder.setCamera(mServiceCamera);
            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
            mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
            mMediaRecorder.setOutputFile("/sdcard/filenamevideo.mp4");
            mMediaRecorder.setVideoFrameRate(30);
            mMediaRecorder.setVideoSize(mPreviewSize.width, mPreviewSize.height);
            mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());

            mMediaRecorder.prepare();
            mMediaRecorder.start(); 

            mRecordingStatus = true;

            return true;

    }

    public void stopMediaRecorder() {
        mServiceCamera.reconnect();

        mMediaRecorder.stop();
        mMediaRecorder.reset();

        mServiceCamera.stopPreview();
        mMediaRecorder.release();

        mServiceCamera.release();
        mServiceCamera = null;
    }
}
public boolean starMediaRecording(){
Camera.Parameters params=mServiceCamera.getParameters();
mServiceCamera.setParameters(参数);
Camera.Parameters p=mServiceCamera.getParameters();
最终列表listSize=p.getSupportedPreviewSizes();
Size-mPreviewSize=listSize.get(2);
p、 setPreviewSize(mPreviewSize.width、mPreviewSize.height);
p、 setPreviewFormat(PixelFormat.YCbCr_420_SP);
mServiceCamera.setParameters(p);
试一试{
mServiceCamera.setPreviewDisplay(mSurfaceHolder);
mServiceCamera.startPreview();
}
捕获(IOE异常){
Log.e(标记,e.getMessage());
e、 printStackTrace();
}
mServiceCamera.unlock();
mMediaRecorder=新的MediaRecorder();
mMediaRecorder.setCamera(mServiceCamera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mMediaRecorder.setOutputFile(“/sdcard/filenamevideo.mp4”);
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.setVideoSize(mPreviewSize.width、mPreviewSize.height);
mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
mMediaRecorder.prepare();
mMediaRecorder.start();
mRecordingStatus=true;
返回true;
}
public void stopMediaRecorder(){
mServiceCamera.reconnect();
mMediaRecorder.stop();
mMediaRecorder.reset();
mServiceCamera.stopReview();
mMediaRecorder.release();
mServiceCamera.release();
mServiceCamera=null;
}
}

这是示例代码,您需要添加自己的逻辑,并相应地处理异常。

我不确定这一点,但我知道您可以在onPause()方法上使用录制方法,这样当您在后台时,将继续录制。顺便说一句,你尝试过什么?认为这是可能的,你也做过同样的事情,如果另一个应用程序或默认的摄像头应用程序请求摄像头怎么办?它将显示已经在使用的相机??这不是一个好习惯吗?谢谢你的快速回复。我试过了,在做了一些小改动后,它就成功了。在你的例子中,mSurfaceHolder是什么?如果我使用的是一个空的,我会在一些设备上出错,如果我只使用一个服务,我就不能真正得到一个。这段代码在Android 2.3.3 HTC Desire上运行良好,但在Galaxy S3和Nexus 4上后台录制失败。有什么想法吗?mSurfaceHolder上也一样。这是我的主要问题,弄清楚在服务中从何处获得它。这种方法中的“mServiceCamera”是什么?你能告诉我你到底做了什么改变吗?