我正试图通过手机访问相机.我在将代码放入窗口小部件之前编写了一个简单的存根应用程序.我没有走得太远.代码总是抛出一个运行时异常"无法连接到摄像头服务"代码(从commonsware示例中收集)出错了:
@Override
public void onResume() {
super.onResume();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
Camera.CameraInfo info = new Camera.CameraInfo();
for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
Camera.getCameraInfo(i, info);
if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
try {
// Gets to here OK
camera = Camera.open(i);
} catch (Exception e) {
e.printStackTrace();
// throws runtime exception :"Failed to connect to camera service"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的证明是(10月20日更正):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.nbt.cameratest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="9" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".CameraTestActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议可能出错的地方?
10月20日更新
SDK 4.0中的Logcat已损坏,并且不会显示日志的结尾,所以我在命令行adb logcat中尽可能地删除了这一点:
W/ServiceManager( 2588): Permission failure: android.permission.CAMERA from uid=10136 pid=5744
E/CameraService( 2588): Permission Denial: can't use the camera pid=5744, uid=10136
W/System.err( 5744): java.lang.RuntimeException: Fail to connect to camera service
W/System.err( 5744): at android.hardware.Camera.native_setup(Native Method)
W/System.err( 5744): at android.hardware.Camera.<init>(Camera.java:294)
W/System.err( 5744): at android.hardware.Camera.open(Camera.java:255)
etc..
Run Code Online (Sandbox Code Playgroud)
我不知道为什么我没有得到许可,因为它在清单中被宣布
Kur*_*aum 55
一些事情:
为什么您的活动代码中包含使用权限和使用功能标记.通常,权限包含在<manifest>标记的直接子项中.这可能是问题的一部分.
根据android camera open文档,抛出了一个运行时异常:
如果与摄像头服务的连接失败(例如,如果摄像头正由另一个进程使用或设备策略管理器已禁用摄像头)
您是否尝试过检查相机是否被其他物品使用,或者您的保单管理员是否有关闭相机的设置?
不要忘记<uses-feature android:name="android.hardware.camera.autofocus" />自动对焦.
虽然我不确定这些中的任何一个是否能直接帮助你,但我认为如果没有别的原因,除了简单地排除外,我们值得调查.如果你愿意尽职尽责.
编辑正如下面的评论中所提到的,解决方案是将uses-permissions应用程序移动到应用程序标记之上.
sam*_*sam 41
对于支持每个应用程序设置权限的较新Android版本(自Marshmallow,6.0起),可以禁用相机权限,并应从应用程序设置启用.
Gin*_*orf 25
Make sure to call the release() method to release the camera when it is no longer needed, or you will not be able to use the camera. Perhaps as a sanity check, see if your regular camera works. If it says it fails, then your previous attempts at runni
小智 12
问题与许可有关.将以下代码复制到onCreate()方法中.这个问题将得到解决.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[] {Manifest.permission.CAMERA}, 1);
}
}
Run Code Online (Sandbox Code Playgroud)
之后等待用户操作并处理他的决定.
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case CAMERA_PERMISSION_REQUEST_CODE:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//Start your camera handling here
} else {
AppUtils.showUserMessage("You declined to allow the app to access your camera", this);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道很久以前这个问题已得到解答,但我想补充一点.
对于每个具有相同错误的人,请确保在清单文件中添加此权限:
<uses-permission android:name="android.permission.CAMERA" />
Run Code Online (Sandbox Code Playgroud)
重要的是使用大写字母CAMERA,因为我有小写字母的许可,但它不起作用.
| 归档时间: |
|
| 查看次数: |
96815 次 |
| 最近记录: |