【问题标题】:Cannot connect to camera service when using ACTION_IMAGE_CAPTURE使用 ACTION_IMAGE_CAPTURE 时无法连接到相机服务
【发布时间】:2011-03-02 02:51:29
【问题描述】:

我正在使用以下代码告诉系统我要拍照:

            Intent intent = new Intent(
                    android.provider.MediaStore.ACTION_IMAGE_CAPTURE, null);
            intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri
                    .fromFile(new File(filePath)));
            startActivityForResult(intent, TAKE_PHOTO_ACTIVITY);

它第一次像冠军一样工作。随后的尝试产生以下异常:

电子/相机支架(8300): java.lang.RuntimeException: 失败 连接到相机服务 E/CameraHolder(8300):在 android.hardware.Camera.native_setup(Native 方法)E/CameraHolder(8300):在 android.hardware.Camera.(Camera.java:110) E/CameraHolder(8300):在 android.hardware.Camera.open(Camera.java:90) E/CameraHolder(8300):在 com.android.camera.CameraHolder.open(CameraHolder.java:100) E/CameraHolder(8300):在 com.android.camera.Camera.ensureCameraDevice(Camera.java:1626) E/CameraHolder(8300):在 com.android.camera.Camera.startPreview(Camera.java:1686) E/CameraHolder(8300):在 com.android.camera.Camera.access$5800(Camera.java:94) E/CameraHolder(8300):在 com.android.camera.Camera$5.run(Camera.java:949) E/CameraHolder(8300):在 java.lang.Thread.run(Thread.java:1096)

我想我必须以某种方式释放相机对象,但由于我没有直接获取它,所以我不知道该怎么做。有人可以帮帮我吗?

【问题讨论】:

  • 你不应该做任何事情,我一直都在使用那个代码。您能否提供更多关于如何实际调用此代码以及如何处理结果的代码?此外,这是否可以在多个设备上重复?干杯。
  • 另外,我们在这里讨论的是哪个版本的 Android?这会发生在模拟器上吗?
  • 安卓 2.2、2.1。不,模拟器没有摄像头。
  • 模拟器(2.1)应该有一个摄像头。此意图在设备上打开相机应用程序(不要在 2.2 emu 上执行此操作,因为相机应用程序将 FC),然后返回照片,因此 hte 模拟器将只返回卡通 android dude.Anyways,您使用的是哪个设备?是否有任何相机应用程序正在运行(例如,如果因为有人没有在另一个应用程序中释放相机而需要很长时间才能获取,那么事情会变得很糟糕)。
  • 如果它第一次工作,它可能是一个发布问题。您是否尝试过在 startActivityForResult() 中释放相机

标签: android


【解决方案1】:

你不需要释放相机对象——这甚至是不可能的,因为你没有它的句柄。该对象在您调用的捕获活动中被释放。

您是否总是使用相同的文件路径?如果是,则尝试每次生成一个唯一的。如果这没有帮助,它显然是一个特定于设备的错误。

【讨论】:

    【解决方案2】:
    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
                startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);  
    

    调用默认相机活动。

    并使用下一个代码检索刚刚拍摄的照片:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAMERA_PIC_REQUEST) {
            Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
            ImageView image = (ImageView) findViewById(R.id.photoResultView);
            image.setImageBitmap(thumbnail);
        }
    }
    

    并在清单文件中添加权限

    <uses-feature
        android:name="android.hardware.camera" />
    <uses-feature
        android:name="android.hardware.camera.autofocus" />
    
    <uses-permission
        android:name="android.permission.CAMERA"></uses-permission>
    

    希望这对你有用。

    【讨论】:

    • 它返回 -1 并且在 Galaxy 选项卡中没有意图数据
    • 在这种情况下使用临时文件来存储你的图片intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri .fromFile(new File(filePath)));
    【解决方案3】:

    我也遇到了同样的问题。然后我想出了这个解决方案,它对我来说很好。

    当您调用相机活动时,在 EXTRA_OUTPUT 中传递存储卡上临时文件的 Uri。当相机活动返回时,在 onActivityResult() 回调方法中,获取之前创建的临时文件,并将其添加到 MediaStore。最后删除临时文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多