Как получить значение строки штрих-кода из предварительного просмотра камеры в TextureView? - PullRequest
0 голосов
/ 29 апреля 2019

Я нуб в андроиде.Кто-нибудь может помочь разобраться в google ml-kit barcodereader?

Я создаю деятельность с TextureView.Предварительный просмотр камеры в TextureView.В коде активности я создаю метод scanBarcode (растровое изображение).Но я не могу получить значение штрих-кода. (((Я использую этот учебник для создания метода scanBarcode. https://firebase.google.com/docs/ml-kit/android/read-barcodes

Что я делаю не так?

public class BarcodeScannerActivityNew extends AppCompatActivity {
private TextureView textureView; //элемент где будет превью
private String cameraId; //id камеры, с которой будем забирать изображение
private Size imageDimension; // размер изображения с камеры
private static final int REQUEST_CAMERA_PERMISSION = 200; //200 - разрешение есть
protected CameraDevice cameraDevice; // камера для колбэка
protected CaptureRequest.Builder captureRequestBuilder; // создание запроса к camera2
protected CameraCaptureSession cameraCaptureSessions;
private Handler mBackgroundHandler;
private HandlerThread mBackgroundThread;
private String bcTitle;
private TextView txt;
//private FirebaseVisionImage fbImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_barcode_scanner_new);
    textureView = (TextureView) findViewById(R.id.texture);
    textureView.setSurfaceTextureListener(textureListener);
    txt = (TextView) findViewById(R.id.editText);
}
TextureView.SurfaceTextureListener textureListener = new TextureView.SurfaceTextureListener() {
    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        openCamera(); //открываем камеру
    }
    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
        // Изменяем размер превью по элементу TextureView
    }
    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        return false;
    }
    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
        // сюда бабахнуть сканнер??



    }
};
private void openCamera() {
    CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    try {
        cameraId = manager.getCameraIdList()[0]; // первая камера
        CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
        StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
        imageDimension = map.getOutputSizes(SurfaceTexture.class)[0];
        // Проверяем есть ли разрешения для камеры, если нет запрашиваем
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(BarcodeScannerActivityNew.this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
            return;
        }
        manager.openCamera(cameraId, stateCallback, null); //колбэк камеры
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}
private final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {
    @Override
    public void onOpened(CameraDevice camera) {
        //Когда камера открыта
        cameraDevice = camera;
        createCameraPreview();
    }
    @Override
    public void onDisconnected(CameraDevice camera) {
        cameraDevice.close();
    }
    @Override
    public void onError(CameraDevice camera, int error) {
        cameraDevice.close();
        cameraDevice = null;
    }
};
protected void createCameraPreview() {
    try {
        SurfaceTexture texture = textureView.getSurfaceTexture();
        texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight());
        final Surface surface = new Surface(texture);
        captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        captureRequestBuilder.addTarget(surface);
        cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback(){
            @Override
            public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
                //Камера закрыта
                if (null == cameraDevice) {
                    return;
                }
                // Когда сессия готова показываем.





                cameraCaptureSessions = cameraCaptureSession;
                updatePreview();
            }
            @Override
            public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
                Toast.makeText(BarcodeScannerActivityNew.this, "Настройки изменились", Toast.LENGTH_SHORT).show();
            }
        }, null);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}
protected void updatePreview() {
    if(null == cameraDevice) {
        //вывод ошибки обновления превью
    }
    captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
    try {
        Bitmap bitmapi = textureView.getBitmap();
        if(bitmapi!=null){
            scanBarcode(bitmapi);
        }

        if(bcTitle != null){
            txt.setText(bcTitle);
        }
        cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(), null, mBackgroundHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == REQUEST_CAMERA_PERMISSION) {
        if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
            // Закрыть приложение
            Toast.makeText(BarcodeScannerActivityNew.this, "Без разрешения камеры невозможно использовать приложение", Toast.LENGTH_LONG).show();
            finish();
        }
    }
}
@Override
protected void onResume() {
    super.onResume();
    startBackgroundThread();
    if (textureView.isAvailable()) {
        openCamera();
    } else {
        textureView.setSurfaceTextureListener(textureListener);
    }
}
protected void startBackgroundThread() {
    mBackgroundThread = new HandlerThread("Camera Background");
    mBackgroundThread.start();
    mBackgroundHandler = new Handler(mBackgroundThread.getLooper());
}
protected void onPause() {
    //closeCamera();
    stopBackgroundThread();
    super.onPause();
}
protected void stopBackgroundThread() {
    mBackgroundThread.quitSafely();
    try {
        mBackgroundThread.join();
        mBackgroundThread = null;
        mBackgroundHandler = null;
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
private void scanBarcode(Bitmap bitmap){
    FirebaseVisionBarcodeDetectorOptions options =
            new FirebaseVisionBarcodeDetectorOptions.Builder()
                    .setBarcodeFormats(
                            FirebaseVisionBarcode.FORMAT_EAN_13)
                    .build();


    //bcTitle="куку";
    FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(bitmap);
    FirebaseVisionBarcodeDetector detector = FirebaseVision.getInstance()
            .getVisionBarcodeDetector(options);
    //bcTitle="куку";
    Task<List<FirebaseVisionBarcode>> result = detector.detectInImage(image)
            .addOnSuccessListener(new OnSuccessListener<List<FirebaseVisionBarcode>>() {
                @Override
                public void onSuccess(List<FirebaseVisionBarcode> barcodes) {
                    // Task completed successfully
                    // ...
                    //bcTitle="aaa";//сюда попадаем после разблокировки экрана, возможно перперисовать интерфейс, даже если ничего не поймал
                    for (FirebaseVisionBarcode barcode: barcodes) {
                        bcTitle="aaa";
                        Rect bounds = barcode.getBoundingBox();
                        Point[] corners = barcode.getCornerPoints();

                        String rawValue = barcode.getRawValue();

                        int valueType = barcode.getValueType();
                        bcTitle = barcode.getRawValue();

                        // See API reference for complete list of supported types
                        /*
                        switch (valueType) {
                            case FirebaseVisionBarcode.TYPE_WIFI:
                                String ssid = barcode.getWifi().getSsid();
                                String password = barcode.getWifi().getPassword();
                                int type = barcode.getWifi().getEncryptionType();
                                break;
                            case FirebaseVisionBarcode.TYPE_URL:
                                String title = barcode.getUrl().getTitle();
                                String url = barcode.getUrl().getUrl();
                                break;
                        }
                        */


                    }

                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    // Task failed with an exception
                    // ...
                    bcTitle="ffff";
                }
            });
}

}

...