首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android 4.0中的后台视频录制

Android 4.0中的后台视频录制
EN

Stack Overflow用户
提问于 2013-02-24 13:43:24
回答 3查看 17.7K关注 0票数 23

我尝试在Android4.0中组织背景视频录制。但由于这些问题,我不能这样做:

  1. 虚拟表面在MediaRecorder中不起作用(错误:无效表面)
  2. 如果您在活动时使用表面1 x 1像素,表面在活动暂停时被销毁(录制停止)
  3. 如果您在WindowsManager上使用表面1 x 1 px,则表面在应用程序暂停时被销毁(录制在MediaRecorder.setPreviewDisplay中不起作用(新Surface(SurfaceTexture))
  4. Widget不允许处理表面1 x 1 px
  5. 状态栏不允许处理表面1 x 1 px

请帮我找一找正确的路。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-26 17:22:00

我找到了答案:有必要使用WindowManager并从服务中调用它。

票数 -4
EN

Stack Overflow用户

发布于 2013-05-15 05:07:56

示例和简单的代码(在Jelly Bean、SGS2上测试):

public class BackgroundVideoRecorder extends Service implements SurfaceHolder.Callback {

    private WindowManager windowManager;
    private SurfaceView surfaceView;
    private Camera camera = null;
    private MediaRecorder mediaRecorder = null;

    @Override
    public void onCreate() {

        // Start foreground service to avoid unexpected kill
        Notification notification = new Notification.Builder(this)
            .setContentTitle("Background Video Recorder")
            .setContentText("")
            .setSmallIcon(R.drawable.ic_launcher)
            .build();
        startForeground(1234, notification);

        // Create new SurfaceView, set its size to 1x1, move it to the top left corner and set this service as a callback
        windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
        surfaceView = new SurfaceView(this);
        LayoutParams layoutParams = new WindowManager.LayoutParams(
            1, 1,
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
            PixelFormat.TRANSLUCENT
        );
        layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
        windowManager.addView(surfaceView, layoutParams);
        surfaceView.getHolder().addCallback(this);

    }

    // Method called right after Surface created (initializing and starting MediaRecorder)
    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {

        camera = Camera.open();
        mediaRecorder = new MediaRecorder();
        camera.unlock();

        mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
        mediaRecorder.setCamera(camera);
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

        mediaRecorder.setOutputFile(
                Environment.getExternalStorageDirectory()+"/"+
                DateFormat.format("yyyy-MM-dd_kk-mm-ss", new Date().getTime())+
                ".mp4"
        );

        try { mediaRecorder.prepare(); } catch (Exception e) {}
        mediaRecorder.start();

    }

    // Stop recording and remove SurfaceView
    @Override
    public void onDestroy() {

        mediaRecorder.stop();
        mediaRecorder.reset();
        mediaRecorder.release();

        camera.lock();
        camera.release();

        windowManager.removeView(surfaceView);

    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {}

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {}

    @Override
    public IBinder onBind(Intent intent) { return null; }

}

别忘了权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
票数 43
EN

Stack Overflow用户

发布于 2014-03-24 14:44:39

try { 
        mediaRecorder.prepare(); 
    } catch (Exception e) {}
    mediaRecorder.start();
    Timer t = new Timer();
    t.schedule(new TimerTask() {
        @Override
        public void run() {
            stopSelf();
        }
    }, 5000);
}catch(Exception e){}

只需对上面的计时器稍作修改,即可根据您的需要将5秒文件保存到ur sdcard...modify中的根文件夹中。它在Nexus 4和Micromax上也能工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15049041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档