Reputation: 13617
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
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