Bhuvanesh BS
Bhuvanesh BS

Reputation: 13617

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

I'm using QRCodeReaderView to scan Qr Code. I have searched about this issue, all solutions are related to permission. In my code, I'm starting camera after checking the permission.

The issue is it asking for camera permission and also crashes the app got crashed.

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();
            }
        }
    }
}

In XML layout I have included the below code:

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

My 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'
}

In my manifest, I have included Camera Permission.

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

Error Log:

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$3.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)

A Strange thing is. The Request Permission dialog popped up. Also app crashed at the same time. The camera not called anywhere in the class. Help me to solve the issue.

Upvotes: 0

Views: 572

Answers (1)

Bhuvanesh BS
Bhuvanesh BS

Reputation: 13617

I solved this issue by requesting permission before entering into the fragment.

The QrCodeReaderView tries to open camera after the view created. So I have changed the permission part outside of the fragment.

Upvotes: 0

Related Questions