首页 > 解决方案 > 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中无缝编译,但是当我在手机上运行它时,相机只是变黑并且没有崩溃。

有人知道怎么修这个东西吗?

标签: javaandroidandroid-studioandroid-fragments

解决方案


从 Android 6.0(API 23) 开始,您需要向用户请求运行时权限。这就是为什么您的相机不显示任何内容的原因。权限仅在 AndroidManifest 中定义,但用户不同意允许您的应用程序使用摄像头。您有一个很好的例子来说明如何在此处请求运行时权限。

如果您想了解更多相关信息,Android 开发人员还提供了文档:


推荐阅读