我正在尝试拍摄一张照片,但没有通过服务向用户显示任何内容(没有视图)。这个问题以前问过好几次,我已经查遍了所有能找到的东西。一些类似的问题:
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。任何帮助都会很棒的,谢谢。

最佳答案

碰巧,谜题中的最后一块砖头是在提问一周后才显露出来的。这个问题是特定于一个设备的,即一加一。
https://github.com/alexcohn/CameraInService处的示例代码显示了如何处理此问题;最新提交在开始预览和执行takepicture()之间添加了延迟。对我妻子的一加一的实验表明,100毫秒的延迟是可以的,但1毫秒太短了。

08-17 21:20