Android: ¿Es posible tomar una foto con la cámara desde un servicio sin UI

El único código que he podido conseguir trabajando para tomar una foto con la cámara funciona de una actividad. Estoy bastante seguro de que es posible tomar una foto de dentro de un servicio, o de un AsyncTask lanzado por el servicio.

Me parece que la API de la cámara necesita un SurfaceView que debe estar atado a una interfaz de usuario. Tal vez yo estoy equivocado. ¿Alguien ha escrito código en el que se puede tomar una foto de un servicio?

No creo que esto sea posible ya que la cámara necesita una pantalla de vista previa. Vea la pregunta similar aquí

Es posible mediante WindowManager en Android.

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

Debo decir que sí que necesita SurfaceView para tomar una foto, pero no tiene que estar atado a un cierto formato xml. Puede agregarla a la clase WindowManager que funciona incluso en el servicio. Así que el WindowManager aquí abre una "ventana" para hacer cualquier efecto flotante en Android.

Específicamente,

Puede agregar un SurfaceView al WindowManager y establecer los parámetros como sigue.

 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 tiene esta funcionalidad, mientras que iOS no. Esta es la razón por la que puede tener Facebook chathead activo en la pantalla de inicio en Android en lugar de iOS.

Mostrar facebook como la cabeza de conversación de un receptor de difusión en android

He aquí un código más completo si todavía estás buscando. Funciona en un servicio (probado):

 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(); } } 
  • Camera.release () tarda 30 segundos en liberar la cámara en Nexus 10. ¿Hay alguna forma de acelerar el proceso?
  • ¿Cómo puedo hacer que un SurfaceView sea más grande que la pantalla?
  • Cámara personalizada Android congelar después del zoom
  • Cómo hacer que el selector de intenciones para la aplicación de cámara o galería en android como whatsapp editprofile?
  • Cámara Android centrada sólo una vez
  • Cómo dividir las imágenes de cámara izquierda y derecha (HTC Evo 3D) en los datos de previsualización de la cámara
  • Cómo obtener imágenes de la imagen de vídeo en Android
  • Manejo correcto de la excepción: "getParameters failed (empty parameters)"
  • Galería de imágenes de Google Fotos - Galería de imágenes de intenciones
  • Cámara con sonido de obturador personalizado
  • La cámara personalizada Android se bloquea en el curriculum vitae
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.