【问题标题】:QRCodeReaderView java.lang.RuntimeException:Fail to connect to camera serviceQRCodeReaderView java.lang.RuntimeException: 连接相机服务失败
【发布时间】:2018-02-09 13:29:21
【问题描述】:

我正在使用 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: 致命例外:主要 进程: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) 在 com.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)

奇怪的是。 请求权限对话框弹出。同时应用崩溃。摄像头在课堂上的任何地方都没有调用。帮我解决问题。

【问题讨论】:

    标签: java android camera qr-code


    【解决方案1】:

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

    QrCodeReaderView 在创建视图后尝试打开相机。所以我改变了fragment之外的权限部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 2011-10-16
      • 2018-03-12
      • 2020-12-03
      • 2015-05-18
      相关资源
      最近更新 更多