Tire uma foto usando um serviço no OnePlus One - usando o WindowManager hack
Estou tentando tirar uma foto sem mostrar nada ao usuário (sem exibição) por meio de um serviço. Esta pergunta já foi feita várias vezes e eu já passei por tudo o que pude encontrar. Algumas perguntas semelhantes:
Falha no Android Camera.takePicture
A câmera do Android falha ao tirar uma foto do serviço em segundo plano
A maioria das perguntas está vinculada a outras perguntas sem fornecer uma nova solução.
Eu acredito que esta é a melhor maneira de resolver este problema:https://stackoverflow.com/a/10268650/3860594 Infelizmente, a pessoa não forneceu uma resposta completa e estou tendo problemas para reproduzir seu método.
O que estou tentando fazer é criar um SurfaceView dentro de um SurfaceHolder. Vou usar o WindowManager com o SurfaceView para criar uma espécie de janela flutuante que é completamente transparente para ocultar o usuário. Por favor me corrija se eu estiver errado.
Aqui está o meu 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 disso funciona como a mensagem usualRuntimeException: takePicture failed
é mostrado. Qualquer ajuda seria incrível, obrigado.