我正试着通过手机访问相机。我在将代码放入窗口小部件之前编写了一个简单的存根应用程序。我没有走得太远。代码总是抛出一个运行时异常“无法连接到摄像头服务”代码(从公共软件示例中收集)出错了:
@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"
}
}
}
}
}
我的清单是(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>
有人可以建议可能出现的问题吗?
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..
我不知道为什么我没有权限,因为它在清单
中声明答案 0 :(得分:50)
少数事情:
为什么您的activity标记中包含use-permissions和use-features标记。通常,权限包含在<manifest>
标记的直接子级中。这可能是问题的一部分。
根据android camera open documentation,抛出运行时异常:
如果与相机服务的连接失败(例如,如果相机正由另一个进程使用或设备策略管理器已禁用相机)
您是否尝试过检查相机是否被其他物品使用,或者您的保单管理员是否有关闭相机的设置?
不要忘记自动对焦的<uses-feature android:name="android.hardware.camera.autofocus" />
。
虽然我不确定这些中的任何一项是否会直接帮助你,但我认为如果没有别的原因,他们值得调查,而不是简单地排除。如果你愿意尽职尽责。
EDIT
如下面的评论所述,解决方案是将uses-permissions
移到应用程序标记之上。
答案 1 :(得分:36)
对于支持每个应用程序设置权限的较新Android版本(自Marshmallow,6.0起),可以禁用相机权限,并应从应用程序设置启用。
答案 2 :(得分:23)
确保调用release()方法在不再需要时释放相机,否则您将无法使用相机。也许作为一个完整性检查,看看你的普通相机是否有效。如果它说它失败了,那么你以前尝试过runni
答案 3 :(得分:9)
问题与许可有关。将以下代码复制到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);
}
}
之后等待用户操作并处理他的决定。
@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);
}
}
}
答案 4 :(得分:6)
我知道很久以前这个问题已得到解答,但我想补充一点。
对于每个具有相同错误的人,请务必在清单文件中添加此权限:
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
User userItem = mDataset.get(position);
holder.displayName.setText(userItem.getDisplayName());
holder.username.setText(userItem.getUsername());
setOnClickListener(...
onClick() {
Context context = holder.displayName.getContext();
Intent intent = new Intent(context, ActivityB.class);
intent.putExtra("user", Parcels.wrap(userItem));
context.startActivity(intent);
});
}
重要 使用<uses-permission android:name="android.permission.CAMERA" />
的大写字母,因为我获得了小写字母的许可,但它没有用。
答案 5 :(得分:3)
运行您的代码数百次可能会影响相机正常运行。您的活动可能正常运行但系统无法购买。因此相机强制停止。 所有错过的一个主要提示是重新启动你的手机而不仅仅是eclipse ..它对我有用..
答案 6 :(得分:1)
因为这个问题是在4年前被问到的......除非提问者提到,否则我没有意识到..当没有运行时权限支持时。
但希望它对仍然陷入这种情况的用户有用.. 看看Run Time Permissions,对我来说它解决了这个问题 当我添加运行时权限以授予相机访问权限。 或者,您可以通过转到您的移动设置=&gt; Apps =&gt;(选择您的应用)=&gt;出现的窗口中的权限部分手动授予应用权限,并启用/禁用所需的权限。 希望这会奏效。
答案 7 :(得分:1)
我想出了同样的问题,我分享了如何修复它。它可能会帮助一些人。
首先,检查您的Android版本。如果它在 Android 6.0和更高 r(API级别23+)上运行,那么您需要:
**<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />**
<application ...>
...
</application>
然后,请求用户在运行时批准每项权限
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// here, Permission is not granted
ActivityCompat.requestPermissions(this, new String[] {android.Manifest.permission.CAMERA}, 50);
}
有关详细信息,请查看API文档here
答案 8 :(得分:0)
使用camera.open时;你完成了使用相机写这个推荐camera.release();这将停止相机,以便您可以再次使用
答案 9 :(得分:-2)
我有同样的问题。尝试了这里提到的所有解决方案但没有任何效果。所以我重启了我的设备,突然问题解决了。