从后台服务打开相机而不录制

时间:2016-02-01 15:34:41

标签: android camera video-streaming android-service

我想使用服务打开设备的前置摄像头以获得连续帧并实时处理它们。我可以使用MediaRecorder执行此操作,如以下代码所示:

public class BackgroundService extends Service implements SurfaceHolder.Callback {
    private int  NOTIFICATION_ID= 1;
    MediaRecorder mediaRecorder;
    private static final String TAG = "OCVSample::Activity";
    // Binder given to clients
    private final IBinder mBinder = new LocalBinder();

    public class LocalBinder extends Binder {
        BackgroundService getService() {
            // Return this instance of this service so clients can call public methods
            return BackgroundService.this;
        }
    }//end inner class that returns an instance of the service.

    @Override
    public IBinder onBind(Intent intent) {

        return mBinder;
    }//end onBind.


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

    @Override
    public void onCreate() {

        // Start foreground service to avoid unexpected kill

        startForeground(NOTIFICATION_ID, buildNotification());

        // 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);
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
                100, 100,
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT
        );

        Log.i(TAG, "100 x 100 executed");

        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) {

        Log.i(TAG, "surfaceCreated method");


        camera = Camera.open(1);

        camera.unlock();


        mediaRecorder = new MediaRecorder();



        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() {

        Log.i(TAG, "surfaceDestroyed method");

        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) {


    }


    private Notification buildNotification () {

        NotificationCompat.Builder notificationBuilder=new NotificationCompat.Builder(this);

        notificationBuilder.setOngoing(true); //this notification should be ongoing

        notificationBuilder.setContentTitle(getString(R.string.notification_title))
                .setContentText(getString (R.string.notification_text_and_ticker))
                .setSmallIcon(R.drawable.vecsat_logo)
                .setTicker(getString(R.string.notification_text_and_ticker));
        return(notificationBuilder.build());

    }

}//end service.

但这记录了视频,我不想要那样。我只是想打开相机来实时获取帧。我试图直接打开它而不使用MediaRecorder,但它的视图没有显示,我只是更改了surfaceCreated方法中的代码部分,如下所示:

  @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {

        Log.i(TAG, "surfaceCreated method");

        try {

            camera = Camera.open(1);
            camera.setPreviewDisplay(surfaceView.getHolder());
            camera.unlock();
        }

        catch (IOException e){

        }

    }

有人可以告诉我如何在没有录音的情况下打开相机吗?

感谢。

0 个答案:

没有答案