Nehmen Sie ein Foto mit einem Dienst auf OnePlus One auf - mit WindowManager hack

Ich versuche, ein Bild aufzunehmen, ohne dem Benutzer über einen Dienst etwas (keine Ansicht) zu zeigen. Diese Frage wurde bereits mehrmals gestellt und ich habe alles durchgesehen, was ich finden konnte. Einige ähnliche Fragen:

Android Camera.takePicture fehlgeschlagen

Android-Kamera kann kein Foto vom Hintergrunddienst aufnehmen

Die meisten Fragen verweisen auf andere Fragen, ohne eine neue Lösung bereitzustellen.

ch glaube, dies ist der beste Weg, um dieses Problem zu lösen:https: //stackoverflow.com/a/10268650/386059 Leider hat die Person keine vollständige Antwort geliefert und ich habe Probleme, seine Methode zu reproduzieren.

Was ich versuche, ist ein SurfaceView in einem SurfaceHolder zu erstellen. Ich werde dann WindowManager mit dem SurfaceView verwenden, um eine Art schwebendes Fenster zu erstellen, das vollständig transparent ist, so dass es vor dem Benutzer verborgen bleibt. Bitte korrigiere mich wenn ich falsch liege

Hier ist mein Code:

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

Keine davon funktioniert wie die übliche MeldungRuntimeException: takePicture failed wird gezeigt. Jede Hilfe wäre super, danke.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage