使用ACTION_IMAGE_CAPTURE时无法连接相机服务

6
我使用以下代码告诉系统我想要拍照:

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

            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);

第一次运行时它的表现非常出色。但是再次尝试会产生以下异常:
E/CameraHolder(8300): java.lang.RuntimeException: 无法连接到相机服务 E/CameraHolder(8300): 在 android.hardware.Camera.native_setup(Native Method)处 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)处
我想我必须以某种方式释放相机对象,但由于我没有直接获取它,所以不知道如何操作。能否有人帮助我解决这个问题?

你不应该做任何类似的事情,我一直在使用完全相同的代码。你可以提供更多代码,围绕着如何实际调用这个代码以及你如何处理结果?此外,这是否可以在多个设备上重复?干杯。 - devunwired
另外,我们在谈论哪个版本的Android?这是否发生在模拟器上? - E.Z. Hart
Android 2.2,2.1。不过,模拟器没有相机。 - synic
模拟器(2.1)应该有相机。此意图会在设备上打开相机应用程序(不要在2.2模拟器上执行此操作,因为相机应用程序将FC),然后返回照片,所以模拟器只会返回卡通Android人物。无论如何,您使用的是哪种设备?是否有任何相机应用正在运行(例如,如果获取时间很长,因为某人没有在另一个应用程序中释放相机,则情况会变得糟糕)。 - Greg Giacovelli
这是在设备上还是模拟器上?Android 相机在不同的设备上工作方式不同。最好检查一下几个设备以确保正常运行。 - Abhinav
显示剩余2条评论
3个回答

1
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>

希望这对你有用。

在Galaxy Tab中,它返回-1且没有意图数据。 - nicky
在这种情况下,请使用临时文件来存储您的图片: intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(filePath))); - vsm

1

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

您是否总是使用相同的文件路径?如果是,请尝试每次生成一个唯一的文件路径。如果这样做没有帮助,那么很明显是设备特定的错误。


1

我之前也遇到了同样的问题。后来我想出了这个解决方案,现在它对我来说运行得很好。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接