连接相机时出错:0 --- 连接相机服务失败
An error occurred while connecting to camera: 0 --- Fail to connect to camera service
当我在这个特定的 Nexus 5 上打开相机时,我遇到了一个 phone 特定问题。它是 An error occurred while connecting to camera: 0 --- Fail to connect to camera service
错误。在至少十几个其他 phone 上一切正常。在 Nexus 5 上使用相机的其他应用程序没有崩溃(表明并非所有应用程序都无法访问相机,只有我的)。
关于这个还有很多其他问题,我都试过了。他们都在谈论缺少权限,并确保相机在使用后被销毁。
明确我的清单请求并正确使用相机:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera2" />
而且我在销毁时释放相机:
public void releaseCamera()
{
if (_camera != null)
{
_camera.stopPreview();
_camera.setPreviewCallback(null);
_camera.release();
_camera = null;
}
_surfaceHolder.removeCallback(this);
}
你能想出我得到这个的任何理由吗?我怀疑存在某种错误,因为我使用的是相机而不是 camera2,但这是一个大胆的猜测。 Reading the updates for API 6.0 相机上有一节写着:
In This release, the model for accessing shared resources in the
camera service has been changed from the previous “first come, first
serve” access model to an access model where high-priority processes
are favored.
同样,如果不重写整个应用程序以使用 camera2(不是一个选项),我不能确定发生了什么。
这是我打开相机的代码(以及在除 Nexus 5 之外的所有其他 phone 上有效的代码)
private void setInitialCamera()
{
try
{
if (_isBackFacing == true)
{
_camera = Camera.open(0);
} else
{
_camera = Camera.open(1);
}
} catch (RuntimeException e)
{
Log.d("Runtime Exception","Error " + e);
e.printStackTrace();
} catch (Exception e)
{
Log.d("Camera Error: ", " Android is unable tell what the error was");
e.printStackTrace();
}
}
看来罪魁祸首 与 phone 经历的 6.0.1 更新有关。
虽然这在其他 phone 上没有发生,但在故障的 Nexus 5 上却发生了。
6.0.1 更新允许用户为应用程序设置个人权限。因此,以某种方式关闭了相机的许可。重新打开此功能可解决问题。
要到达那里,您需要前往 Settings -> Apps -> [App Name] -> Permissions
让用户手动为您的应用设置权限不是一个好的方法。请改用以下代码,当您的应用首次启动时,它会提示用户许可。
首先设置您的请求代码,用于识别接受或拒绝请求:
private static final int MY_CAMERA_REQUEST_CODE = 100;
然后询问用户是否可以使用相机:
if (checkSelfPermission(Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_REQUEST_CODE);
}
else {
// permission has been already granted, you can use camera straight away
}
最后检查权限是否被授予:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_CAMERA_REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// user accepted your request, you can use camera now from here
}
else {
// user denied your request, you can now handle their decision
}
}
}
当我在这个特定的 Nexus 5 上打开相机时,我遇到了一个 phone 特定问题。它是 An error occurred while connecting to camera: 0 --- Fail to connect to camera service
错误。在至少十几个其他 phone 上一切正常。在 Nexus 5 上使用相机的其他应用程序没有崩溃(表明并非所有应用程序都无法访问相机,只有我的)。
关于这个还有很多其他问题,我都试过了。他们都在谈论缺少权限,并确保相机在使用后被销毁。
明确我的清单请求并正确使用相机:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera2" />
而且我在销毁时释放相机:
public void releaseCamera()
{
if (_camera != null)
{
_camera.stopPreview();
_camera.setPreviewCallback(null);
_camera.release();
_camera = null;
}
_surfaceHolder.removeCallback(this);
}
你能想出我得到这个的任何理由吗?我怀疑存在某种错误,因为我使用的是相机而不是 camera2,但这是一个大胆的猜测。 Reading the updates for API 6.0 相机上有一节写着:
In This release, the model for accessing shared resources in the camera service has been changed from the previous “first come, first serve” access model to an access model where high-priority processes are favored.
同样,如果不重写整个应用程序以使用 camera2(不是一个选项),我不能确定发生了什么。
这是我打开相机的代码(以及在除 Nexus 5 之外的所有其他 phone 上有效的代码)
private void setInitialCamera()
{
try
{
if (_isBackFacing == true)
{
_camera = Camera.open(0);
} else
{
_camera = Camera.open(1);
}
} catch (RuntimeException e)
{
Log.d("Runtime Exception","Error " + e);
e.printStackTrace();
} catch (Exception e)
{
Log.d("Camera Error: ", " Android is unable tell what the error was");
e.printStackTrace();
}
}
看来罪魁祸首 与 phone 经历的 6.0.1 更新有关。
虽然这在其他 phone 上没有发生,但在故障的 Nexus 5 上却发生了。
6.0.1 更新允许用户为应用程序设置个人权限。因此,以某种方式关闭了相机的许可。重新打开此功能可解决问题。
要到达那里,您需要前往 Settings -> Apps -> [App Name] -> Permissions
让用户手动为您的应用设置权限不是一个好的方法。请改用以下代码,当您的应用首次启动时,它会提示用户许可。
首先设置您的请求代码,用于识别接受或拒绝请求:
private static final int MY_CAMERA_REQUEST_CODE = 100;
然后询问用户是否可以使用相机:
if (checkSelfPermission(Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_REQUEST_CODE);
}
else {
// permission has been already granted, you can use camera straight away
}
最后检查权限是否被授予:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_CAMERA_REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// user accepted your request, you can use camera now from here
}
else {
// user denied your request, you can now handle their decision
}
}
}