从服务中的相机拍照 [英] take photo from camera in service

查看:92
本文介绍了从服务中的相机拍照的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在使用中的前置摄像头拍照而不在屏幕上显示摄像头. 我有服务班

How can Take picture from front camera in service without showing camera on screen. I have service class

public class PhotoTakingService extends Service {
    //Camera variables
    //a surface holder
    private SurfaceHolder sHolder;
    //a variable to control the camera
    private Camera mCamera;
    //the camera parameters
    private Parameters parameters;

    boolean mPreviewRunning = false;


    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate() {
        super.onCreate();

    }

    @Override
    public void onStart(Intent intent,int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent,startId);



        mCamera = Camera.open();
        SurfaceView sv = new SurfaceView(getBaseContext());


        try {

            Camera.Parameters p = mCamera.getParameters();
            mCamera.setParameters(p);
            mCamera.startPreview();

            mCamera.takePicture(null,null,mPictureCallback);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        //Get a surface
        sHolder = sv.getHolder();
        //tells Android that this surface will have its data constantly replaced
        sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }


    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
        public void onPictureTaken(byte[] imageData,Camera c) {
            Log.e("Callback TAG","Here in jpeg Callback");

            if (imageData != null) {
                FileOutputStream outputStream = null;
                try {
                    outputStream = new FileOutputStream("/sdcard/car_final/Image.jpg");
                    outputStream.write(imageData);

                    // Removed the finish call you had here
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (outputStream != null) try {
                        outputStream.close();
                    } catch (IOException ex) {
                        // TODO Auto-generated catch block
                        ex.printStackTrace();
                    }
                }

            }
        }
    };

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
}

和主要活动.我想从主要活动中致电.

and main activity. I want to call from main activity.

 public class MainActivity extends Activity implements SurfaceHolder.Callback {



 private static final String TAG = MainActivity.class.getSimpleName();

    public static SurfaceView mSurfaceView;
    public static SurfaceHolder mSurfaceHolder;
    public static Camera mCamera;
    public static boolean mPreviewRunning;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        Button btnStart = (Button) findViewById(R.id.button1);
        btnStart.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                Intent intent = new Intent(MainActivity.this, PhotoTakingService.class);
                //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startService(intent);

            }
        });

      /*  Button btnStop = (Button) findViewById(R.id.StopService);
        btnStop.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                stopService(new Intent(CameraRecorder.this, RecorderService.class));
            }
        });*/
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

    }

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

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }
}

推荐答案

当您在诸如服务之类的后台线程中时,请使用SurfaceTexture而不是SurfaceHolder.如果您正在寻找实现方法这是一个开源应用程序,我已经在其中实现了背景视频流和UI视频流

When you are in background thread such as service use SurfaceTexture instead of SurfaceHolder. If you are looking for implementation here is a opensource app where I have implemented background video stream and UI video stream both.

这篇关于从服务中的相机拍照的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆