在Zxing条码应用程序中获取相机错误

时间:2012-01-27 03:48:24

标签: android android-camera barcode-scanner zxing

我正在尝试使用Zxing Library开发条形码扫描仪。

我的活动如下:

public class Scanner extends Activity {  

    private static final String PACKAGE = "com.test.scan";  
    private static final String SCANNER = "com.google.zxing.client.android.SCAN";  
    private static final String SCAN_FORMATS = "UPC_A,UPC_E,EAN_8,EAN_13,CODE_39,CODE_93,CODE_128";  
    private static final String SCAN_MODE = "QR_CODE_MODE";  
    public static final int REQUEST_CODE = 1;  

    @Override  
    public void onCreate(Bundle icicle) {  
        super.onCreate(icicle);  

        setContentView(R.layout.main);  

         Button ok;  
         ok = (Button) findViewById(R.id.b1);  
         ok.setOnClickListener(new View.OnClickListener() {  

             public void onClick(View v) {  

                Intent scanIntent = new Intent(SCANNER);  
                scanIntent.setPackage(PACKAGE);  
                scanIntent.addCategory(Intent.CATEGORY_DEFAULT);  
                scanIntent.putExtra("SCAN_FORMATS", SCAN_FORMATS);  
                scanIntent.putExtra("SCAN_MODE", SCAN_MODE);  
                try {  
                    startActivityForResult(scanIntent, REQUEST_CODE);  
                } catch (ActivityNotFoundException e) {  
                     // TODO: Exception handling  
                }  
            }  

        });  
     }

同样显示文件:

    <activity android:name=".Scanner"
            android:screenOrientation="landscape"   android:configChanges="orientation|keyboardHidden"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            android:windowSoftInputMode="stateAlwaysHidden">  
                 <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>

</activity>

<activity android:name="com.google.zxing.client.android.CaptureActivity"
                android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden"  
                android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                android:windowSoftInputMode="stateAlwaysHidden">
                <intent-filter>
                    <action     android:name="com.google.zxing.client.android.SCAN" />
                    <category    android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>
            <activity android:name="com.google.zxing.client.android.PreferencesActivity"
                android:label="@string/preferences_name">
            </activity>
            <activity android:name="com.google.zxing.client.android.HelpActivity"
                android:screenOrientation="user">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>
            <activity android:name="com.google.zxing.client.android.share.ShareActivity"
                android:label="@string/share_name" android:screenOrientation="user"
                android:theme="@android:style/Theme.Light">
                <intent-filter>
                    <action android:name="com.google.zxing.client.android.SHARE" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>
    <uses-permission android:name="android.permission.CAMERA"

但是我收到以下错误:

“抱歉,Android相机遇到了问题。您可能需要重启设备”。

我关注了很少的博客。

记录:

   Unexpected error initializating camera  
    01-27 10:40:48.281: WARN/CaptureActivity(1007): java.lang.RuntimeException: Fail to connect to camera service  
    01-27 10:40:48.281: WARN/CaptureActivity(1007):     at android.hardware.Camera.native_setup(Native Method)  
    01-27 10:40:48.281: WARN/CaptureActivity(1007):     at android.hardware.Camera.<init>(Camera.java:185)  
    01-27 10:40:48.281: WARN/CaptureActivity(1007):     at android.hardware.Camera.open(Camera.java:165)
   01-27 10:40:48.281: WARN/CaptureActivity(1007):     at com.google.zxing.client.android.camera.CameraManager.openDriver(CameraManager.java:126)
    01-27 10:40:48.281: WARN/CaptureActivity(1007):     at com.google.zxing.client.android.CaptureActivity.initCamera(CaptureActivity.java:606)  
    01-27 10:40:48.281: WARN/CaptureActivity(1007):     at com.google.zxing.client.android.CaptureActivity.surfaceCreated(CaptureActivity.java:346)   
    01-27 10:40:48.281: WARN/CaptureActivity(1007):     at android.view.SurfaceView.updateWindow(SurfaceView.java:532)  
    01-27 10:40:48.281: WARN/CaptureActivity(1007):     at android.view.SurfaceView.dispatchDraw(SurfaceView.java:339) 

11 个答案:

答案 0 :(得分:33)

对于Android 6+,因为&#34;权限&#34;问题,如果收到消息&#34;抱歉,相机遇到问题。您可能需要重新启动设备。&#34;,转到设置 - 应用 - 找到&#34;您的应用名称&#34; - 选择权限并打开&#34;相机&#34;。

答案 1 :(得分:15)

相机许可

<uses-permission android:name="android.permission.CAMERA"

不在适当的地方。它应该在申请标签之后。

答案 2 :(得分:7)

这意味着设备从null返回了Camera.open(),它不应该这样做。它被视为设备错误。我不知道你会如何调试它为什么会这样做,但这就是原因。

我唯一一次看到这种情况发生在Android 2.2设备上,只有前置摄像头。用于访问前置摄像头的API仅出现在Android 2.3中,之前的Camera.open() API方法可能只返回后置摄像头。所以这些返回null。它确实是一个设备错误,因为他们真的需要运行Android 2.3才能让应用程序使用前置摄像头。

答案 3 :(得分:2)

我遇到了类似的问题。     在Android M上进行测试时,相机需要运行时权限。添加此答案仅供参考,以帮助陷入类似情况的任何人。

答案 4 :(得分:1)

只需使用Toast添加摄像机权限:

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
              == PackageManager.PERMISSION_GRANTED) {
          // Permission is already available, start camera preview
          Toast.makeText(this,"camera permission granted",Toast.LENGTH_LONG).show();


      } else {
          // Permission is missing and must be requested.
          requestCameraPermission();
      }

和:

private void requestCameraPermission() {
        // Permission has not been granted and must be requested.
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.CAMERA)) {
            // Provide an additional rationale to the user if the permission was not granted
            // and the user would benefit from additional context for the use of the permission.
            // Display a SnackBar with cda button to request the missing permission.
            Toast.makeText(this, "Camera access is required to Scan The Barcode.",
                    Toast.LENGTH_LONG).show();


                    // Request the permission
                    ActivityCompat.requestPermissions(CaptureActivity.this,
                            new String[]{Manifest.permission.CAMERA},
                            PERMISSION_REQUEST_CAMERA);



        } else {
            Toast.makeText(this,
                    "<b>Camera could not be opened.</b>\\nThis occurs when the camera is not available (for example it is already in use) or if the system has denied access (for example when camera access has been disabled).", Toast.LENGTH_SHORT).show();
            // Request the permission. The result will be received in onRequestPermissionResult().
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CAMERA);
        }
    }

答案 5 :(得分:0)

您可能有设备管理员禁用对相机的访问权限。应该检查Android相机应用程序是否可以启动,或者它是否抱怨设备管理员。

答案 6 :(得分:0)

我遇到了同样的问题 用

修正了它
SurfaceHolder surfaceHolder = surfaceView.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

注意:这似乎是操作系统的最新问题(前V3.0 Android),因为代码以前正在运行。

答案 7 :(得分:0)

我在Android 8.1.0上解决了该问题,并通过代码请求了该应用的权限。

这样做的原因(我认为)是由于在更新的Android版本中处理设备访问的策略已更改,您必须在代码中请求权限。在XML中放置所需的权限是不够的。使用该应用程序时,用户必须选择拒绝访问。

要激活“ give-permission-popup”,您可以使用以下示例在您的MainActivity的onCreate里面:

    if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA)
            == PackageManager.PERMISSION_DENIED) {
        ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.CAMERA}, MY_CAMERA_REQUEST_CODE);
    }

它应具有与通过设置激活权限相同的效果。但是在实际的应用中,从应用内部请求权限可能更加用户友好。

答案 8 :(得分:-1)

我只需将相机权限放在主应用程序中即可解决问题。

答案 9 :(得分:-2)

如果您在Android 2.2的Android模拟器中调用相机,它将提供异常。虽然它在设备上运行良好。

答案 10 :(得分:-2)

检查你的代码,我认为你的代码试图多次打开相机。 下载谷歌zxing条码扫描器源代码,然后尝试。