Я использовал этот ответ, чтобы создать автономный проект библиотеки Android, в котором есть исходный код ZXing (ZXing v2.1). Он компилируется отлично, и если я запустил CaptureActivity, я могу прочитать QR-код, как ожидалось.
У меня есть другой проект Android, из которого я хочу потянуть эту библиотеку. Я правильно установил связь с библиотекой.
Проблема, с которой я столкнулась, заключается в том, как мне запустить локальную копию сканера ZXing через IntentIntegrator (упомянутый здесь).
Я пробовал модифицировать метод IntentIntegrator.initiateScan() для использования моей локальной копии CaptureActivity и загружает QR-сканер должным образом. Однако, как только QR-код сканируется, информация QR отображается на экране вместо того, чтобы отправить результат обратно на мою вызывающую активность в onActivityResult.
Как я могу заставить его отправлять результаты QR-сканирования в onActivityResult моей активности?
Для справки, вот что я изменил метод IntentIntegrator.initiateScan():
public AlertDialog initiateScan(Activity act, Collection<String> desiredBarcodeFormats) {
//Hardcoding name of activity to call --> is this where I've gone wrong?
Intent intentScan = new Intent(act, CaptureActivity.class);
intentScan.addCategory(Intent.CATEGORY_DEFAULT);
// check which types of codes to scan for
if (desiredBarcodeFormats != null) {
// set the desired barcode types
StringBuilder joinedByComma = new StringBuilder();
for (String format : desiredBarcodeFormats) {
if (joinedByComma.length() > 0) {
joinedByComma.append(',');
}
joinedByComma.append(format);
}
intentScan.putExtra("SCAN_FORMATS", joinedByComma.toString());
}
//Commented this out because it didn't seem to find my class...
// String targetAppPackage = findTargetAppPackage(intentScan);
// if (targetAppPackage == null) {
// return showDownloadDialog();
// }
//
//
// intentScan.setPackage(targetAppPackage);
intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
attachMoreExtras(intentScan);
startActivityForResult(intentScan, REQUEST_CODE);
return null;
}
И я запускаю сканирование следующим образом:
IntentIntegrator integrator = new IntentIntegrator(getActivity());
integrator.initiateScan(getActivity());
Я чувствую, что мне не хватает чего-то легкого здесь, любой толчок в правильном направлении будет большим.
Решение
Вот что закончилось работать. Я все равно вызываю его так же:
IntentIntegrator integrator = new IntentIntegrator(getActivity());
integrator.initiateScan(getActivity());
Но метод initiateScan теперь выглядит следующим образом:
public AlertDialog initiateScan(Activity act, Collection<String> desiredBarcodeFormats)
{
Intent intentScan = new Intent(BS_PACKAGE + ".SCAN");
intentScan.addCategory(Intent.CATEGORY_DEFAULT);
// check which types of codes to scan for
if (desiredBarcodeFormats != null) {
// set the desired barcode types
StringBuilder joinedByComma = new StringBuilder();
for (String format : desiredBarcodeFormats) {
if (joinedByComma.length() > 0) {
joinedByComma.append(',');
}
joinedByComma.append(format);
}
intentScan.putExtra("SCAN_FORMATS", joinedByComma.toString());
}
//THIS WAS THE KEY
setSingleTargetApplication(act.getPackageName());
String targetAppPackage = findTargetAppPackage(intentScan);
if (targetAppPackage == null) {
return showDownloadDialog();
}
intentScan.setPackage(targetAppPackage);
intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
attachMoreExtras(intentScan);
act.startActivityForResult(intentScan, REQUEST_CODE);
return null;
}
Важно убедиться, что BS_PACKAGE указывает на пакет CaptureActivity, который вы называете "act.startActivityForResult..." вместо "startActivityForResult..." и вы вызываете setSingleTargetApplication с именем пакета приложения, которое будет вызывать сканер.