Как я могу найти контекст и начать новую деятельность с Android Firebase ML-Kit BarcodeScannerProcessor onSuccess
Я использую код быстрого запуска Android, предоставленный Google, но после многих попыток я не смог найти контекст, который не возвращает ноль. BarcodeScannerProcessor сам по себе не является Activity, поэтому я попытался создать экземпляр LivePreviewActivity и использовать его в качестве контекста в намерении, но он нулевой.
Цель состоит в том, чтобы после того, как действительный штрих-код был распознан, я хочу открыть новое действие, которое позволяет пользователю проверить значение, и одним нажатием кнопки вызвать веб-сервис для отправки штрих-кода в базу данных через API. Я испытываю трудности с поиском действительного контекста, и приложение падает, когда оно пытается выполнить Намерение.
Начиная со строки 97-107:
for (int i = 0; i < barcodes.size(); ++i) {
FirebaseVisionBarcode barcode = barcodes.get(i);
BarcodeGraphic barcodeGraphic = new BarcodeGraphic(graphicOverlay, barcode);
graphicOverlay.add(barcodeGraphic);
System.out.println(barcode.getRawValue());
if (!barcode.getRawValue().equals("") ) {
System.out.println("Got the number:" + barcode.getRawValue() + " Context: " + mContext); //OLD SCHOOL DEBUG OUTPUT
//enter code to start activity
Intent intent = new Intent(mContext, SendScannedBarcode.class);
String message = scannedBarcode;
intent.putExtra(EXTRA_MESSAGE, message);
mContext.startActivity(intent);
}
}
Вы можете сделать резервную копию в репозитории, чтобы увидеть экземпляр LivePreviewActivity, где я пытаюсь получить контекст.
Я попробовал несколько вещей и прочитал о Контексте, Представлениях и Действиях и в основном полностью запутался. Единственное, что я могу найти, это использовать Kotlin, который не помогает прояснить ситуацию.
Я приветствую любую помощь в выявлении или определении действительного намерения из этого контекста. Спасибо.
3 ответа
Поэтому я предполагаю, что в вашем LivePreviewActivity
вы создаете объект класса BarcodeScanningProcessor
, Что вы можете сделать, это изменить конструктор в BarcodeScanningProcessor
класс, чтобы принять контекст, а затем вы передаете в LivePreviewActivity
контекст.
Вот как должен выглядеть код:
В BarcodeScanningProcessor
:
public BarcodeScanningProcessor(Context context) {
// Note that if you know which format of barcode your app is dealing with, detection will be
// faster to specify the supported barcode formats one by one, e.g.
// new FirebaseVisionBarcodeDetectorOptions.Builder()
// .setBarcodeFormats(FirebaseVisionBarcode.FORMAT_QR_CODE)
// .build();
detector = FirebaseVision.getInstance().getVisionBarcodeDetector();
this.mContext = context;
}
Затем в LivePreviewActivity
:
В конкретном случае вашей деятельности вы будете делать:
case BARCODE_DETECTION:
Log.i(TAG, "Using Barcode Detector Processor");
cameraSource.setMachineLearningFrameProcessor(new BarcodeScanningProcessor(getApplicationContext()));
break;
Или, если вы просто хотите создать объект класса, вы можете сделать: BarcodeScanningProcessor bsp = new BarcodeScanningProcessor(getApplicationContext());
Это должно дать вам BarcodeScanningProcessor
Классифицируйте контекст вашей деятельности. Сейчас в BarcodeScanningProcessor
mContext не должен быть нулевым и будет иметь контекст вашей деятельности. Надеюсь, это ответит на ваш вопрос.
Вы можете получить контекст из graphicOverlay
:
Context context = graphicOverlay.getContext();
Попробуйте это создать Application
учебный класс
import android.app.Application;
public class MyApplication extends Application {
static MyApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance=this;
}
public static MyApplication getInstance() {
return instance;
}
}
Зарегистрироваться в файле манифеста
<application
..
android:name="com.yourpackage.MyApplication"
..>
.
.
.
</application>
начать деятельность с помощью этого MyApplication.
Intent intent = new Intent(MyApplication.getInstance(), SendScannedBarcode.class);
String message = scannedBarcode;
intent.putExtra(EXTRA_MESSAGE, message);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MyApplication. getInstance().startActivity(intent);
Другим способом решения этой проблемы является создание нового конструктора BarcodeScanningProcessor, который возвращает интерфейсный вызов и после завершения обработки возвращает результат вызывающей стороне.
public interface BarcodeUpdateListener {
@UiThread
void onBarcodeDetected(Barcode barcode);
}
private BarcodeUpdateListener callback;
public BarcodeScanningProcessor(BarcodeUpdateListener callback){
this.callback = callback;
detector = FirebaseVision.getInstance().getVisionBarcodeDetector();
}
Как только вы получите результат, передайте результат вызывающей стороне.
callback.onBarcodeDetected(<Barcode>)