【问题标题】:Unstable Camera behaviour on AndroidAndroid 上的相机行为不稳定
【发布时间】:2016-05-09 05:05:07
【问题描述】:

我正在编写相机应用程序。我已经开始使用android.hardware.Camera 和相应的类。但有时我的应用程序无法连接到相机。这取决于设备型号和 Android 版本。但是,如果应用程序在某些设备上运行良好,一两天后它就会开始失败。我注意到的另一件事 - 如果我的应用无法连接,那么内置相机应用也无法连接。

我在 stackoverflow 上阅读了几乎所有与 Camera API 和相关异常相关的帖子,并决定用 CommonsGuy 的库 https://github.com/commonsguy/cwac-cam2 替换我的代码。而且,不幸的是,失败仍然存在。

我发现失败后我只能在设备重启后才能再次使用 Camera API。

所以我想问一下,是否可以通过编程方式在不重新启动设备的情况下再次使用相机?也许有办法杀死相机服务或上传原生相机代码?

失败示例(Nexus 4、Android 5.1):

Fatal Exception: java.lang.RuntimeException: Fail to connect to camera service
   at android.hardware.Camera.<init>(Camera.java:497)
   at android.hardware.Camera.open(Camera.java:342)
   at com.commonsware.cwac.cam2.ClassicCameraEngine$1.run(ClassicCameraEngine.java:78)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
   at java.lang.Thread.run(Thread.java:818)

【问题讨论】:

  • 在不同的情况下释放相机,例如从前到后或反之亦然,onDestroy() 方法等。做一些代码:mCamera.stopPreview(); mCamera.release();
  • 由于前置摄像头连接器损坏,我的手机也遇到了这个问题。解决方案是在按下相机连接器部分的同时重新启动设备
  • 如果您的应用程序比内置相机应用程序更频繁地发生这种情况,那么您的代码有一些错误,没有在必要时释放相机。应用停止时可能会出现一些棘手的线程冲突,很容易失去对相机的跟踪。
  • 在有根设备上,杀死 MediaServer 很简单。在非 root 设备上,没有已知漏洞可以强制重启,至少没有任何漏洞适用于所有 ROM 和型号。

标签: android camera commonsware-cwac


【解决方案1】:

所以我想问一下,是否可以通过编程方式在不重新启动设备的情况下再次使用相机?

不,抱歉。

【讨论】:

    【解决方案2】:

    检查此参考:http://developer.android.com/training/camera/cameradirect.html 试试这个代码:

    try
    {
        releaseCameraAndPreview();
        if (camId == 0) {
            mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
        } else {
            mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
        }
    }
    
    catch(Exception e)
    {
        Log.e(getString(R.string.app_name), "failed to open Camera");
        e.printStackTrace();
    }
    

    然后在某处添加这个函数:

    private void releaseCameraAndPreview() {
        myCameraPreview.setCamera(null);
        if (mCamera != null) {
            mCamera.release();
            mCamera = null;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 2019-08-02
      • 1970-01-01
      • 2012-04-24
      • 2011-04-24
      • 2015-08-19
      相关资源
      最近更新 更多