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
.
之外的权限部分
我正在使用 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
.