QRCodeReaderView java.lang.RuntimeException:连接相机服务失败

QRCodeReaderView java.lang.RuntimeException:Fail to connect to camera service

我正在使用 QRCodeReaderView 扫描二维码。我已经搜索过这个问题,所有解决方案都与权限有关。在我的代码中,我在检查权限后启动相机。

问题是它在请求相机权限并且还崩溃了应用程序崩溃了。

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"/>

错误日志:

08-29 18:19:49.384 25813-25813/com.yap.activation E/AndroidRuntime: FATAL EXCEPTION: main Process: com.yap.activation, PID: 25813 java.lang.RuntimeException: Fail to connect to camera service at android.hardware.Camera.(Camera.java:511) at android.hardware.Camera.open(Camera.java:353) at com.google.zxing.client.android.camera.open.OpenCameraInterface.open(OpenCameraInterface.java:76) at com.google.zxing.client.android.camera.CameraManager.openDriver(CameraManager.java:104) at com.dlazaro66.qrcodereaderview.QRCodeReaderView.surfaceCreated(QRCodeReaderView.java:213) at android.view.SurfaceView.updateWindow(SurfaceView.java:582) at android.view.SurfaceView.onPreDraw(SurfaceView.java:177) at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1119) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6060) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) at android.view.Choreographer.doCallbacks(Choreographer.java:670) at android.view.Choreographer.doFrame(Choreographer.java:606) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) at android.os.Handler.handleCallback(Handler.java:746) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5443) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

奇怪的是。 请求权限 对话框弹出。同时 app 崩溃了。 class 中的任何地方都没有调用相机。帮我解决问题。

我通过在进入片段之前请求权限解决了这个问题。

QrCodeReaderView 尝试在创建视图后打开相机。所以我更改了 fragment.

之外的权限部分