Я использую 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"/>
Журнал ошибок:
Странная вещь. Появится диалоговое окно Запросить разрешение. Кроме того, в то же время приложение зависло. Камера не называется нигде в классе. Помогите мне решить задачу.
Я решил эту проблему, запросив разрешение перед входом во фрагмент.