java - Android QR Code Scanner 相机未在 Fragment 中打开
问题描述
我尝试在片段中创建 QR 码扫描仪,但相机不会显示在 surfaceview 中并且只是变黑。
这是我的java类:
public class ScanFragment extends Fragment {
SurfaceView surfaceView;
CameraSource cameraSource;
TextView textView;
BarcodeDetector barcodeDetector;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_scan, container, false);
surfaceView = (SurfaceView) view.findViewById(R.id.cameraPreview);
textView = (TextView) view.findViewById(R.id.scanText);
barcodeDetector = new BarcodeDetector.Builder(view.getContext().getApplicationContext())
.setBarcodeFormats(Barcode.QR_CODE).build();
cameraSource = new CameraSource.Builder(view.getContext().getApplicationContext(), barcodeDetector)
.setRequestedPreviewSize(640, 480).build();
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (ActivityCompat.checkSelfPermission(getContext().getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
return;
}
try {
cameraSource.start(holder);
}catch (IOException e){
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
cameraSource.stop();
}
});
barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
@Override
public void release() {
}
@Override
public void receiveDetections(Detector.Detections<Barcode> detections) {
final SparseArray<Barcode> qrCodes = detections.getDetectedItems();
if(qrCodes.size() != 0){
textView.post(new Runnable() {
@Override
public void run() {
Vibrator vibrator = (Vibrator) getContext().getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(1000);
textView.setText(qrCodes.valueAt(0).displayValue);
}
});
}
}
});
return view;
}
}
我从 android 清单文件中授予了使用权限。在android studio中无缝编译,但是当我在手机上运行它时,相机只是变黑并且没有崩溃。
有人知道怎么修这个东西吗?
解决方案
从 Android 6.0(API 23) 开始,您需要向用户请求运行时权限。这就是为什么您的相机不显示任何内容的原因。权限仅在 AndroidManifest 中定义,但用户不同意允许您的应用程序使用摄像头。您有一个很好的例子来说明如何在此处请求运行时权限。
如果您想了解更多相关信息,Android 开发人员还提供了文档:
推荐阅读
- powershell - Powershell:删除arraylist中的重复条目
- python - 在 Python 3 中生成随机数学
- php - 使用参数重定向到另一个 PHP 的 PHP
- ruby-on-rails - 转发域但保留 URL
- domain-driven-design - 我可以将所有应用程序服务放在 DDD 中的前端吗?
- azure - 如何在数据块中显示所有视图
- javascript - JavaScript 数组表达式在一行中返回对象字面量
- authentication - 如何捕获存在隐藏 SAML POST 的请求的 SAML 响应?
- android - 使用 Room.inMemoryDatabaseBuilder() 的完美用例是什么?
- javascript - 汇总异常以保留模块