【问题标题】:openCamera in AsyncTask returns "IllegalArgumentException"AsyncTask 中的 openCamera 返回“IllegalArgumentException”
【发布时间】:2018-02-13 16:34:06
【问题描述】:

我正在尝试创建一个 AsyncTask 它将在后台拍照,但我正在接收

java.lang.IllegalArgumentException:处理程序参数为空,但调用线程中不存在looper

doInBackgroung 方法中我有:

    @Override
protected String doInBackground(Object[] objects) {
    startBackgroundThread();
    openCamera();
    takePicture();
    return "Executed";
}

然后在openCamera方法中:

private void openCamera() {
    CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
    try{
        cameraId = manager.getCameraIdList()[1];
        CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
        StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
        assert map != null;
        imageDimension = map.getOutputSizes(SurfaceTexture.class)[0];

        manager.openCamera(cameraId,stateCallback,null); //It is breaking here

    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

有什么建议可以解决这个问题吗?

编辑:忘了说当我只使用普通 Activity 时应用程序运行良好,但现在我想将该相机代码移动到 AsyncTask 中,以便它在后台运行。 p>

【问题讨论】:

  • 不要从 doinbackground 函数中调用这三个函数。
  • @greenapps 那怎么办呢?我对 Android 开发非常陌生,所以如果您能建议我如何解决它,我将不胜感激。

标签: android android-asynctask android-camera2


【解决方案1】:

AsyncTask 旨在用于短期操作,并且在内部不使用相机 API 所需的 Looper。可以改用HandlerThread,或者您自己管理LooperThread

不过,在使用后台线程时,您可能会遇到与 Android M+ 相关的其他电源管理问题。为了节省电池寿命,对后台操作进行了限制。确保您需要在后台使用相机。

【讨论】:

  • 所以基本上我第一次尝试使用 IntentService,我也遇到了这个问题 - stackoverflow.com/questions/48768663/…。根据您的建议,我应该将整个 CameraService.java 代码转换为 HandlerThread 吗?是的,我真的需要我的相机在后台
  • 您可以在服务中使用处理程序线程。 IntentService 会出现问题,因为一旦 Intent 处理程序完成,服务就会自行销毁。
猜你喜欢
  • 2015-05-10
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2019-07-20
  • 2016-09-17
相关资源
最近更新 更多