QRCodeReaderView java.lang.RuntimeException: не удалось подключиться к службе камеры

Я использую QRCodeReaderView для сканирования Qr-кода. Я искал эту проблему, все решения связаны с разрешением. В моем коде я запускаю камеру после проверки разрешения.

Проблема в том, что он запрашивает разрешение камеры, а также вылетает из-за сбоя приложения.

QrScanningFragment:

public class QrScanningFragment extends Fragment implements QRCodeReaderView.OnQRCodeReadListener {
    public static final String TAG = "QrScanningFragment";
    private Button btn_ScanQr, btn_cancel;
    private QRCodeReaderView qrCodeReaderView;
    private RelativeLayout rlBeforeScan, rlBtnScanQr;
    private int MY_PERMISSIONS_CAMERA = 133;
    private MediaPlayer mediaPlayer;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_scan_qr, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        btn_ScanQr = (Button) view.findViewById(R.id.btnScan_qr);
        btn_cancel = (Button) view.findViewById(R.id.btn_backFromQr);
        rlBeforeScan = (RelativeLayout) view.findViewById(R.id.before_scanned);
        rlBtnScanQr = (RelativeLayout) view.findViewById(R.id.rl_btn_scan);
        qrCodeReaderView = (QRCodeReaderView) view.findViewById(R.id.qrCodeReaderView);
        setListeners();
    }

    private void setListeners() {
        btn_ScanQr.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                rlBeforeScan.setVisibility(View.VISIBLE);
                rlBtnScanQr.setVisibility(View.GONE);
            }
        });
        btn_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getActivity().getFragmentManager().popBackStack();
            }
        });
    }

    @Override
    public void onQRCodeRead(String qrData, PointF[] points) {
        qrCodeReaderView.stopCamera();
    }

    public void checkCameraPermissions() {
        if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            openCamera();
        } else {
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_CAMERA);
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        checkCameraPermissions();
    }


    @Override
    public void onPause() {
        super.onPause();
        qrCodeReaderView.stopCamera();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        releaseMediaPlayer();
    }

    private void openCamera() {
        qrCodeReaderView.setOnQRCodeReadListener(this);
        qrCodeReaderView.setQRDecodingEnabled(true);
        qrCodeReaderView.setAutofocusInterval(2000L);
        qrCodeReaderView.setBackCamera();
        qrCodeReaderView.startCamera();
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == MY_PERMISSIONS_CAMERA) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                openCamera();
            }
        }
    }
}

В разметку XML я включил следующий код:

    <com.dlazaro66.qrcodereaderview.QRCodeReaderView
        android:id="@+id/qrCodeReaderView"
        android:layout_width="270dp"
        android:layout_height="270dp"
        android:layout_below="@+id/instruction"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="5dp" />

Мой Gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "26.0.1"
defaultConfig {
    applicationId "com.yap.activation"
    minSdkVersion 17
    multiDexEnabled true
    versionCode 100
    versionName "1.0.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

packagingOptions {
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/NOTICE'
}
dexOptions {
    javaMaxHeapSize "4g"
}
}

dependencies {
    compile files('libs/retrofit-1.9.0.jar')
    compile files('libs/okhttp-2.2.0.jar')
    compile files('libs/bcprov-jdk15-1.45.jar')
    compile files('libs/okio-1.6.0.jar')
    compile('com.dlazaro66.qrcodereaderview:qrcodereaderview:2.0.2@aar') {
        transitive = true
    }
    compile 'com.android.support:appcompat-v7:25.4.0'
    compile 'com.fasterxml.jackson.core:jackson-core:2.6.2'
    compile 'com.fasterxml.jackson.core:jackson-annotations:2.6.2'
    compile 'com.microsoft.azure.android:azure-storage-android:0.7.0@aar'
    compile 'com.google.android.gms:play-services-maps:10.2.6'
    compile 'com.google.android.gms:play-services-location:10.2.6'
    compile 'com.google.android.gms:play-services-gcm:10.2.6'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.6.2'
    compile 'com.google.code.gson:gson:2.7'
    compile 'commons-io:commons-io:2.4'
    compile 'com.facebook.android:facebook-android-sdk:4.9.0'
    compile 'com.android.support:support-v4:25.4.0'
}

В моем манифесте я включил разрешение камеры.

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

Журнал ошибок:

Странная вещь. Появится диалоговое окно Запросить разрешение. Кроме того, в то же время приложение зависло. Камера не называется нигде в классе. Помогите мне решить задачу.

Я решил эту проблему, запросив разрешение перед входом во фрагмент.


person Bhuvanesh BS    schedule 31.08.2017    source источник


Ответы (1)


QrCodeReaderView пытается открыть камеру после создания представления. Поэтому я изменил часть разрешений за пределами fragment.

08-29 18:19:49.384 25813-25813/com.yap.activation E/AndroidRuntime: НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.yap.activation, PID: 25813 java.lang.RuntimeException: не удалось подключиться к службе камеры на Android .hardware.Camera.(Camera.java:511) в android.hardware.Camera.open(Camera.java:353) в com.google.zxing.client.android.camera.open.OpenCameraInterface.open(OpenCameraInterface.java: 76) в com.google.zxing.client.android.camera.CameraManager.openDriver(CameraManager.java:104) в c om.dlazaro66.qrcodereaderview.QRCodeReaderView.surfaceCreated(QRCodeReaderView.java:213) в android.view.SurfaceView.updateWindow(SurfaceView.java:582) в android.view.SurfaceView$3.onPreDraw(SurfaceView.java:177) в android. view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944) в android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067) в android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1119) в android.view.ViewRootImpl$TraversalRunnable .run(ViewRootImpl.java:6060) на android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) на android.view.Choreographer.doCallbacks(Choreographer.java:670) на android.view.Choreographer.doFrame(Choreographer.java:606) на android. view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) на android.os. Handler.handleCallback(Handler.java:746) в android.os.Handler.dispatchMessage(Handler.java:95) в android.os.Looper.loop(Looper.java:148) в android.app.ActivityThread.main(ActivityThread .java:5443) в java.lang.reflect.Method.invoke(собственный метод) в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) в com.android.internal.os.ZygoteInit .main(ZygoteInit.java:618)

person Bhuvanesh BS    schedule 01.09.2017