在安卓后台服务中打开/运行相机

14

想要开发一个可以在后台持续录制的应用程序,这是可行的吗?


我不确定那个,但我知道你可以在onPause()方法上使用录制方法,这样当你的应用在后台时会继续录制。另外,你尝试过什么? - Kosh
你认为这是可能的,而且你已经做过同样的事情,但如果另一个应用程序或默认相机应用程序请求相机呢?它会显示相机已在使用中吗?这不是一种好习惯,看起来像间谍活动吗? - Athul Harikumar
1个回答

14

是的,这是完全有可能的。

创建一个活动,在某个事件上启动后台服务,或者你也可以使用闹钟管理器根据需要启动和停止服务。

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

    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;
    }
}

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


6
在您的示例中,mSurfaceHolder是什么?如果我使用一个空的SurfaceHolder在某些设备上会出现错误,并且如果我只使用服务,则无法获取SurfaceHolder。 - Yalla T.
3
这段代码在安卓2.3.3的HTC Desire手机上可以正常运行,但在Galaxy S3和Nexus 4手机上后台录音失败。有什么想法吗? - Sergii
2
同样的问题出现在mSurfaceHolder上。这是我的主要问题,我还没弄清楚在Service中如何获取它。 - Rahat Ahmed
3
这个方法中的“mServiceCamera”是什么?DraD,请告诉我你具体做了哪些更改? - Pratik Dasa
@Pawan MпЉМдї£з†БдЄ≠mRecordingStatusзЪДз±їеЮЛжШѓдїАдєИпЉЯ - Peter Zhu
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接