无法连接到相机服务

时间:2011-10-19 22:49:34

标签: android

我正试着通过手机访问相机。我在将代码放入窗口小部件之前编写了一个简单的存根应用程序。我没有走得太远。代码总是抛出一个运行时异常“无法连接到摄像头服务”代码(从公共软件示例中收集)出错了:

    @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..

我不知道为什么我没有权限,因为它在清单

中声明

10 个答案:

答案 0 :(得分:50)

少数事情:

  1. 为什么您的activity标记中包含use-permissions和use-features标记。通常,权限包含在<manifest>标记的直接子级中。这可能是问题的一部分。

  2. 根据android camera open documentation,抛出运行时异常:

      

    如果与相机服务的连接失败(例如,如果相机正由另一个进程使用或设备策略管理器已禁用相机)

    您是否尝试过检查相机是否被其他物品使用,或者您的保单管理员是否有关闭相机的设置?

  3. 不要忘记自动对焦的<uses-feature android:name="android.hardware.camera.autofocus" />

  4. 虽然我不确定这些中的任何一项是否会直接帮助你,但我认为如果没有别的原因,他们值得调查,而不是简单地排除。如果你愿意尽职尽责。

    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+)上运行,那么您需要:

  1. 在应用manifest中声明权限。确保在应用程序标记
  2. 上插入权限

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

    1. 然后,请求用户在运行时批准每项权限

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

    2. 有关详细信息,请查看API文档here

答案 8 :(得分:0)

使用camera.open时;你完成了使用相机写这个推荐camera.release();这将停止相机,以便您可以再次使用

答案 9 :(得分:-2)

我有同样的问题。尝试了这里提到的所有解决方案但没有任何效果。所以我重启了我的设备,突然问题解决了。