Tome una foto usando un servicio en OnePlus One - usando el truco WindowManager
Estoy tratando de tomar una foto sin mostrarle al usuario nada (sin vista) a través de un servicio. Esta pregunta se ha hecho varias veces antes y he revisado todo lo que pude encontrar. Algunas preguntas similares:
Android Camera.takePicture falló
La cámara de Android no puede tomar fotos del servicio en segundo plano
La mayoría de las preguntas enlazan con otras preguntas sin proporcionar una nueva solución.
Creo que esta es la mejor manera de resolver este problema:https://stackoverflow.com/a/10268650/3860594 Lamentablemente, la persona no ha proporcionado una respuesta completa y estoy teniendo problemas para reproducir su método.
Lo que intento hacer es crear un SurfaceView dentro de un SurfaceHolder. Luego usaré WindowManager con SurfaceView para crear una ventana flotante que sea completamente transparente para que esté oculta para el usuario. Por favor corrígeme si estoy equivocado.
Aquí está mi código:
SurfaceView mview = new SurfaceView(this);
SurfaceHolder mholder = new SurfaceHolder() {
@Override
public void addCallback(Callback callback) {
}
@Override
public void removeCallback(Callback callback) {
}
@Override
public boolean isCreating() {
return false;
}
@Override
public void setType(int type) {
}
@Override
public void setFixedSize(int width, int height) {
}
@Override
public void setSizeFromLayout() {
}
@Override
public void setFormat(int format) {
}
@Override
public void setKeepScreenOn(boolean screenOn) {
}
@Override
public Canvas lockCanvas() {
return null;
}
@Override
public Canvas lockCanvas(Rect dirty) {
return null;
}
@Override
public void unlockCanvasAndPost(Canvas canvas) {
}
@Override
public Rect getSurfaceFrame() {
return null;
}
@Override
public Surface getSurface() {
return null;
}
};
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.TRANSLUCENT);
wm.addView(mview, params);
mview.setZOrderOnTop(true);
mholder.setFormat(PixelFormat.TRANSPARENT);
try {
camera.setPreviewDisplay(mview.getHolder());
camera.startPreview();
camera.takePicture(null,null,photoCallback);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Nada de esto funciona como el mensaje habitualRuntimeException: takePicture failed
se muestra. Cualquier ayuda sería genial, gracias.