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.

Respuestas a la pregunta(1)

Su respuesta a la pregunta