使用 OnePlus One 上的服务拍照 - 使用 WindowManager hack
Take a photo using a service on OnePlus One - using WindowManager hack
我正在尝试通过服务拍照而不向用户显示任何内容(无视图)。这个问题之前已经被问过好几次了,我已经遍历了我能找到的所有内容。一些类似的问题:
Android Camera.takePicture failed
Android camera fails to take photo from background service
大部分问题link其他问题没有提供新的解决方案。
我认为这是解决此问题的最佳方法:
不幸的是,此人没有提供完整的答案,我无法重现他的方法。
我想做的是在 SurfaceHolder 中创建一个 SurfaceView。然后,我将使用 WindowManager 和 SurfaceView 创建一个完全透明的浮动 window,以便对用户隐藏。如有错误请指正
这是我的代码:
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();
}
None 显示正常消息 RuntimeException: takePicture failed
。任何帮助都会很棒,谢谢。
碰巧在提出问题一周后才揭开谜题中的最后一块砖。该问题特定于特定设备,即 OnePlus One。
https://github.com/alexcohn/CameraInService 中的示例代码显示了如何处理此问题;最新的提交在开始预览和执行 takePicture() 之间增加了延迟。在我老婆的OnePlus One上实验,延迟100ms还可以,但是1ms太短了。
我正在尝试通过服务拍照而不向用户显示任何内容(无视图)。这个问题之前已经被问过好几次了,我已经遍历了我能找到的所有内容。一些类似的问题:
Android Camera.takePicture failed
Android camera fails to take photo from background service
大部分问题link其他问题没有提供新的解决方案。
我认为这是解决此问题的最佳方法: 不幸的是,此人没有提供完整的答案,我无法重现他的方法。
我想做的是在 SurfaceHolder 中创建一个 SurfaceView。然后,我将使用 WindowManager 和 SurfaceView 创建一个完全透明的浮动 window,以便对用户隐藏。如有错误请指正
这是我的代码:
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();
}
None 显示正常消息 RuntimeException: takePicture failed
。任何帮助都会很棒,谢谢。
碰巧在提出问题一周后才揭开谜题中的最后一块砖。该问题特定于特定设备,即 OnePlus One。
https://github.com/alexcohn/CameraInService 中的示例代码显示了如何处理此问题;最新的提交在开始预览和执行 takePicture() 之间增加了延迟。在我老婆的OnePlus One上实验,延迟100ms还可以,但是1ms太短了。