ZXingScannerView Android 6 相机权限
ZXingScannerView Android 6 Camera Permission
我在 Fragment
中使用 ZXingScannerView
作为二维码 reader
现在我无法使用新的 Android 6 权限让相机正常工作。
低于API23一切正常。
在我的 onCreateView
方法中,我检查是否已授予相机权限,否则会请求它。对话框出现,我可以授予权限。
但是在我更改设备的方向之前,相机预览一直保持黑色。
这是我的代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state){
mScannerView = new ZXingScannerView(getActivity());
if (ActivityCompat.checkSelfPermission(getMainActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CAMERA_SCAN_QR);
} else {
if(state != null) {
mFlash = state.getBoolean(FLASH_STATE, false);
mAutoFocus = state.getBoolean(AUTO_FOCUS_STATE, true);
mSelectedIndices = state.getIntegerArrayList(SELECTED_FORMATS);
mCameraId = state.getInt(CAMERA_ID, -1);
} else {
mFlash = false;
mAutoFocus = true;
mSelectedIndices = null;
mCameraId = -1;
}
}
return mScannerView;
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CAMERA_SCAN_QR && hasPermission(grantResults)) {
Logger.logInfo("permission granted");
mScannerView.setResultHandler(this);
mScannerView.startCamera(mCameraId);
mScannerView.setFlash(mFlash);
mScannerView.setAutoFocus(mAutoFocus);
}
}
private boolean hasPermission(int[] grantResults) {
return grantResults.length > 0 && grantResults[0] == PERMISSION_REQUEST_CAMERA_SCAN_QR;
}
@Override
public void onResume() {
super.onResume();
mScannerView.setResultHandler(this);
mScannerView.startCamera(mCameraId);
mScannerView.setFlash(mFlash);
mScannerView.setAutoFocus(mAutoFocus);
}
我猜你应该在初始化 ZXingScannerView 之前请求权限。尽管如此,我还是建议让父 activity 请求权限。因此,当您拥有正确的权限时,您只需启动 ScanSomethingActivity。
此外,如果获得许可,此库可能会让您的生活更轻松:
我在 Fragment
中使用 ZXingScannerView
作为二维码 reader
现在我无法使用新的 Android 6 权限让相机正常工作。
低于API23一切正常。
在我的 onCreateView
方法中,我检查是否已授予相机权限,否则会请求它。对话框出现,我可以授予权限。
但是在我更改设备的方向之前,相机预览一直保持黑色。
这是我的代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state){
mScannerView = new ZXingScannerView(getActivity());
if (ActivityCompat.checkSelfPermission(getMainActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CAMERA_SCAN_QR);
} else {
if(state != null) {
mFlash = state.getBoolean(FLASH_STATE, false);
mAutoFocus = state.getBoolean(AUTO_FOCUS_STATE, true);
mSelectedIndices = state.getIntegerArrayList(SELECTED_FORMATS);
mCameraId = state.getInt(CAMERA_ID, -1);
} else {
mFlash = false;
mAutoFocus = true;
mSelectedIndices = null;
mCameraId = -1;
}
}
return mScannerView;
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CAMERA_SCAN_QR && hasPermission(grantResults)) {
Logger.logInfo("permission granted");
mScannerView.setResultHandler(this);
mScannerView.startCamera(mCameraId);
mScannerView.setFlash(mFlash);
mScannerView.setAutoFocus(mAutoFocus);
}
}
private boolean hasPermission(int[] grantResults) {
return grantResults.length > 0 && grantResults[0] == PERMISSION_REQUEST_CAMERA_SCAN_QR;
}
@Override
public void onResume() {
super.onResume();
mScannerView.setResultHandler(this);
mScannerView.startCamera(mCameraId);
mScannerView.setFlash(mFlash);
mScannerView.setAutoFocus(mAutoFocus);
}
我猜你应该在初始化 ZXingScannerView 之前请求权限。尽管如此,我还是建议让父 activity 请求权限。因此,当您拥有正确的权限时,您只需启动 ScanSomethingActivity。
此外,如果获得许可,此库可能会让您的生活更轻松: