安卓:是否有可能采取与从服务相机在照片没有UI [复制](Android: Is it possib

2019-07-18 03:18发布

这个问题已经在这里有一个答案:

  • 拍照摄像头,从没有预览 9个回答

我已经能够唯一的代码,以获得工作拍照与从活动的相机运行。 我相当肯定,有可能采取从服务中的照片,或从服务启动了的AsyncTask。

在我看来,照相机API需要必须绑成一个UI SurfaceView。 也许我是错的。 有没有人写,其中光可以从服务采取的代码?

Answer 1:

我不认为这是可能的,因为相机需要的预览画面。 看到类似的问题在这里



Answer 2:

它通过使用是可能的WindowManager在Android系统。

https://stackoverflow.com/a/10268650/3047840

我应该说是你需要SurfaceView拍照,但它并没有被束缚在一定XML布局。 你可以把它添加到WindowManager类即使在服务工作。 所以, WindowManager在这里打开一个“窗口”为你做任何Android的浮体效应。

特别,

您可以添加一个SurfaceViewWindowManager和设置参数如下。

mPreview = new CameraPreview(this, mCamera, jpegCallback);
WindowManager wm = (WindowManager) this
        .getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
        WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
        PixelFormat.TRANSPARENT);

params.height = 1;
params.width = 1;

wm.addView(mPreview, params);

Android有这个功能,而iOS则不会。 这就是为什么你可以有Facebook在Android的,而不是iOS的主屏幕上chathead活跃。

显示Facebook的像Android中的广播接收机聊天头



Answer 3:

下面是一些更完整的代码,如果你还在寻找。 工作中的服务(测试):

private void takePhoto() {

    System.out.println( "Preparing to take photo");
    Camera camera = null;

    int cameraCount = 0;
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    cameraCount = Camera.getNumberOfCameras();
    for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
        SystemClock.sleep(1000);

        Camera.getCameraInfo(camIdx, cameraInfo);

            try {
                camera = Camera.open(camIdx);
            } catch (RuntimeException e) {
                System.out.println("Camera not available: " + camIdx);
                camera = null;
                //e.printStackTrace();
            }
        try{
            if (null == camera) {
                System.out.println("Could not get camera instance");
            }else{
                System.out.println("Got the camera, creating the dummy surface texture");
                //SurfaceTexture dummySurfaceTextureF = new SurfaceTexture(0);
                try {
                    //camera.setPreviewTexture(dummySurfaceTextureF);
                    camera.setPreviewTexture(new SurfaceTexture(0));
                    camera.startPreview();
                } catch (Exception e) {
                    System.out.println("Could not set the surface preview texture");
                    e.printStackTrace();
                }
                camera.takePicture(null, null, new Camera.PictureCallback() {

                    @Override
                    public void onPictureTaken(byte[] data, Camera camera) {
                        File pictureFileDir = getDir();
                        if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) {
                            return;
                        }
                        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss");
                        String date = dateFormat.format(new Date());
                        String photoFile = "PictureFront_" + "_" + date + ".jpg";
                        String filename = pictureFileDir.getPath() + File.separator + photoFile;
                        File mainPicture = new File(filename);
                        addImageFile(mainPicture);

                        try {
                            FileOutputStream fos = new FileOutputStream(mainPicture);
                            fos.write(data);
                            fos.close();
                            System.out.println("image saved");
                        } catch (Exception error) {
                            System.out.println("Image could not be saved");
                        }
                        camera.release();
                    }
                });
            }
        }catch (Exception e){
            camera.release();
        }


    }


文章来源: Android: Is it possible to take a picture with the camera from a service with no UI [duplicate]