android摄像头服务因打开过快而崩溃

kqlmhetl  于 2021-07-08  发布在  Java
关注(0)|答案(0)|浏览(348)

输出日志中出现以下错误:

08-20 15:12:19.488 W/CameraBase(14231): An error occurred while connecting to camera: 0
08-20 15:12:19.488 W/CameraBase(14231): Camera service died!

因为摄像服务死了。我得到一个弹出窗口,上面写着“不幸的是,谷歌应用程序已经停止了。”。
当弹出窗口出现时。语音识别停止工作,因为它可以关闭谷歌应用程序。
所以试图打开摄像头会导致摄像头坏掉,这会破坏谷歌,破坏一切。
我把原因隔离到我要放相机的地方。
我发现如果我用调试器一步一步地处理它,它不会导致这个问题。
这使我相信,有一个比赛条件下,相机还没有准备好打开,因为它还没有完全释放前一个电话。
我可以手动插入一个延迟来解决这个问题,但是我更愿意找到一个基于状态或回调的解决方案,它不能猜出正确的延迟。
它有很多评论,因为如何窃听的android相机是这么多的尝试和错误,使其工作。

public async Task<bool> GetCamera()
{
    //Android.Hardware.Camera res = null;

    Stopwatch sw = new Stopwatch();
    sw.Start();

    while (sw.ElapsedMilliseconds < 30000)
    {
        try
        {
            if (this.cam != null)
            {
                //this.cam.Unlock();
                this.cam.StopPreview();
                this.cam.SetPreviewCallback(null);
                this.cam.Release();
                //this.cam.Dispose();
                this.cam = null;
            }

            this.cam = Android.Hardware.Camera.Open(this.cameraIndex);

            //this.EnableHDRecording();

            // locking and then unlocking here causes the auto focus to fail
            // no idea why
            //this.LockCamera();

            //this.cam.SetPreviewTexture(surfaceTexture);
            this.cam.SetPreviewDisplay(this.previewSurface);
            this.cam.StartPreview();

            //this.UnlockCamera();

            break;
        }
        catch (Exception x)
        {
            x.ToString();
        }

        await Task.Delay(100);
    }

    if (this.cam == null)
    {
        throw new System.Exception("Unable to  open camera and set preview");
    }

    return true;
    //return res;
}

我怎么知道相机什么时候可以重新打开,这样它就不会因为调用open太快而导致服务崩溃?
如果你想知道我为什么要释放然后需要相机。因为经过一段随机的时间。调用autofocus()时,相机的自动对焦停止工作,直到我重新获取相机后才开始工作。我怀疑这可能是因为我的电话崩溃,重新启动服务,从而重置相机再次工作。
另外,我在android5.1api22上。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题