Камера сканера QR-кода Android не открывается фрагментом

#java #android #android-studio #android-fragments

#java #Android #android-studio #android-фрагменты

Вопрос:

Я пытаюсь создать сканер 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, но когда я запускаю ее на телефоне, камера просто становится черной, и от этого нет сбоев.

Кто-нибудь знает, как это исправить?

Ответ №1:

С Android 6.0(API 23) при включении вам необходимо запросить у пользователей разрешение на выполнение. Вот почему ваша камера ничего не показывает. Разрешение определено только в AndroidManifest, но пользователь не согласился разрешить вашему приложению использовать камеру. Здесь приведен хороший пример того, как запрашивать разрешения среды выполнения.

Если вы хотите прочитать больше об этом, документация также доступна на Android developer: