Я нуб в андроиде.Кто-нибудь может помочь разобраться в 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";
}
});
}
}