其他分享
首页 > 其他分享> > android-在OnePlus One上使用服务拍照-使用WindowManager hack

android-在OnePlus One上使用服务拍照-使用WindowManager hack

作者:互联网

我正在尝试拍照,但不会通过服务向用户显示任何内容(无视图).这个问题已经被问过几次了,我已经找到了所有的答案.一些类似的问题:

> Android Camera.takePicture failed
> Android camera fails to take photo from background service

大多数问题都链接到其他问题,而没有提供新的解决方案.

我相信这是解决此问题的最佳方法: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那样显示.任何帮助都会很棒,谢谢.

解决方法:

碰巧发生了,难题中的最后一块砖块仅在问了问题一周后才露出来.该问题特定于特定设备,即OnePlus One.

https://github.com/alexcohn/CameraInService处的示例代码显示了如何进行处理;最新的提交在开始预览和执行takePicture()之间增加了延迟.我妻子的OnePlus One上的实验表明,100毫秒的延迟还可以,但是1毫秒太短了.

标签:android-camera,oneplusone,android
来源: https://codeday.me/bug/20191119/2037981.html