Получение ошибки камеры в приложении Zxing Barcode - PullRequest
18 голосов
/ 27 января 2012

Я пытаюсь использовать 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 ]

34 голосов
/ 26 апреля 2016

Для Android 6+ из-за проблемы с «разрешением». Если вы получили сообщение «Извините, возникла проблема с камерой. Вам может потребоваться перезагрузить устройство». Перейдите в «Настройки» - «Приложения» - «найдите» свое приложение.name »- выберите« Permissions »и включите« Camera ».

15 голосов
/ 27 января 2012

разрешение камеры

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

не в нужном месте. должно быть после тега приложения.

7 голосов
/ 27 января 2012

Это означает, что устройство вернуло null из Camera.open(), и оно никогда не должно этого делать.Это рассматривается как ошибка устройства.Я не уверен, как вы будете отлаживать, почему он это делает, но в этом причина.

Единственный раз, когда я видел, что это происходит постоянно, это только на устройствах Android 2.2, которые имеют только переднюю камеру.API для доступа к фронтальной камере появился только в Android 2.3, а предыдущий метод Camera.open() API может возвращать только камеру, расположенную назад.Таким образом, они возвращаются null.И это действительно ошибка устройства, так как им действительно нужно использовать Android 2.3, чтобы приложения могли использовать фронтальную камеру.

2 голосов
/ 27 октября 2015

Я столкнулся с подобной проблемой.Во время тестирования на Android M камера требует разрешения времени выполнения .Добавление этого ответа только для справки, чтобы помочь любому, кто застрял в подобном сценарии.

1 голос
/ 14 ноября 2018

Просто добавьте разрешение камеры с 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);
        }
    }
1 голос
/ 12 октября 2018

Я решил проблему на Android 8.1.0, запросив разрешения для приложения с помощью кода.

Причиной этого является (я думаю) из-за изменившихся политик обработки доступа к устройствам в более новых версиях Android, вы должны запросить разрешения в вашем коде. Недостаточно поместить необходимые разрешения в ваш XML. Пользователь должен иметь возможность запретить доступ при использовании приложения.

Чтобы активировать всплывающее окно «дать разрешение», вы можете использовать следующее, например: внутри onCreate вашего MainActivity:

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

Это должно иметь тот же эффект, что и активация разрешения через настройки. Но в реальном приложении запрос разрешений изнутри вашего приложения, вероятно, более удобен для пользователя.

0 голосов
/ 09 июня 2015

У меня такая же проблема Исправлено с помощью

SurfaceHolder surfaceHolder = surfaceView.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

Примечание: это, кажется, недавняя проблема с ОС (до Android V3.0), так как код ранее работал.

0 голосов
/ 23 ноября 2013

Возможно, у вас есть Администратор устройства, отключающий доступ к камере. Следует проверить, может ли приложение для Android-камеры запускаться или оно жалуется на администратора устройства.

0 голосов
/ 03 февраля 2013

Мне удалось решить проблему, просто разместив разрешения камеры в главном приложении.

0 голосов
/ 24 марта 2012

Проверьте ваш код, я думаю, что ваш код пытается открыть камеру несколько раз.Загрузите исходный код сканера штрих-кодов Google zxing и попробуйте его.

...