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.