使用 OnePlus One 上的 WindowManager hack 服务拍照

3
我试图通过服务在不显示任何内容(无视图)的情况下拍照。这个问题之前已经被问过很多次了,我已经查看了所有相关内容。一些类似的问题: 大部分问题都链接到其他问题,没有提供新的解决方案。
我认为解决此问题的最佳方法是:https://dev59.com/VHE95IYBdhLWcg3wQ7uc#10268650 不幸的是,该人并没有提供完整的答案,我正在尝试复制他的方法时遇到了麻烦。
我要做的是在SurfaceHolder中创建一个SurfaceView。然后,我将使用WindowManager与SurfaceView创建一种完全透明的浮动窗口,以便从用户隐藏它。如果我错了,请纠正我。
这是我的代码:
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();
}

这些都不起作用,通常会显示消息RuntimeException:takePicture failed。任何帮助都将是很棒的,谢谢。


问题是,你能在那里看到相机流吗? - Alex Cohn
@AlexCohn 不,应用程序启动后立即崩溃,没有悬浮窗口或取景器。 - john
等一下,你之前看到过“拍照失败”的提示。这次崩溃不同吗? - Alex Cohn
不,这个崩溃看起来完全一样,无论是在手机上还是在 AStudio 上的错误。 - john
mview.getHolder().addCallback() - Alex Cohn
显示剩余23条评论
1个回答

3
这个难题在问题提出一周后才被揭示,它只发生在某些特定设备上,比如OnePlus One。
https://github.com/alexcohn/CameraInService的样例代码中展示了如何解决这个问题;最新的提交增加了在开始预览和执行takePicture()之间的延迟。我对我的妻子的OnePlus One进行了实验,结果显示100毫秒的延迟是可以接受的,但1毫秒太短了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接