Android: возможно ли сделать снимок с камеры из сервиса без пользовательского интерфейса

Единственный код, который мне удалось получить, чтобы сделать снимок с камеры, запускается из активности. Я вполне уверен, что можно сделать фотографию из службы или из AsyncTask, запущенной службой.

Мне кажется, что для API камеры требуется SurfaceView, который должен быть связан с пользовательским интерфейсом. Возможно я не прав. Кто-нибудь написал код, где можно взять фотографию с сервиса?

3 ответа

Решение

Я не думаю, что это возможно, поскольку камере нужен экран предварительного просмотра. Смотрите аналогичный вопрос здесь

Это возможно с помощью WindowManager в Android.

/questions/32106588/fotosemka-s-kameryi-bez-predvaritelnogo-prosmotra/32106598#32106598

Я должен сказать, да, тебе нужно SurfaceView чтобы сделать снимок, но его не нужно привязывать к определенному XML-макету. Вы можете добавить его в WindowManager класс который работает даже в Сервисе. Итак WindowManager здесь открывается "окно" для выполнения любого плавающего эффекта в Android.

В частности,

Вы можете добавить SurfaceView в WindowManager и установите параметры следующим образом.

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.

Показывать фейсбук как чат-чат с трансляции в андроид

Вот еще более полный код, если вы все еще ищете. Работает в сервисе (проверено):

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


    }
Другие вопросы по тегам