【问题标题】:Take a photo using a service on OnePlus One - using WindowManager hack使用 OnePlus One 上的服务拍照 - 使用 WindowManager hack
【发布时间】:2015-12-23 03:21:48
【问题描述】:

我正在尝试在不通过服务向用户显示任何内容(无视图)的情况下拍照。这个问题之前已经被问过好几次了,我已经完成了所有我能找到的。一些类似的问题:

大部分问题都链接到其他问题,但没有提供新的解决方案。

我相信这是解决这个问题的最好方法:https://stackoverflow.com/a/10268650/3860594 不幸的是,这个人没有提供完整的答案,我无法重现他的方法。

我要做的是在 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。任何帮助都会很棒,谢谢。

【问题讨论】:

  • 尝试将窗口设置为不完全透明,并检查它是否真的在屏幕上显示预览。
  • @AlexCohn 感谢您的建议,我尝试将其设置为不透明,但我遇到了同样的错误。
  • 问题是,你在那里看到摄像头流吗?
  • @AlexCohn 不,应用启动后立即崩溃,没有浮动窗口或取景器。
  • 等一下,你之前看到过takePicture failed。这次崩溃是不是不同?

标签: android android-camera oneplusone


【解决方案1】:

碰巧的是,谜题中的最后一块砖在提出问题一周后才被发现。该问题特定于特定设备,即 OnePlus One。

https://github.com/alexcohn/CameraInService 的示例代码显示了如何处理此问题;最新的提交增加了开始预览和执行 takePicture() 之间的延迟。在我老婆的一加一上做实验,延迟100ms还可以,但是1ms太短了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多