2013-02-17 2 views
1

Я использовал this answer для создания автономного проекта библиотеки Android, в котором есть исходный код ZXing (ZXing v2.1). Он компилируется отлично, и если я запустил CaptureActivity, я могу прочитать QR-код, как ожидалось.Получение результатов QR-поиска через ZXing, интегрированное в ваше приложение

У меня есть другой Android-проект, из которого я хочу взять эту библиотеку. Я правильно установил связь с библиотекой.

Проблема, с которой я столкнулась, заключается в том, как запустить мою локальную копию сканера ZXing через IntentIntegrator (упомянуто here).

Я пробовал модифицировать метод 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, что вы называете «акт .startActivityForResult ... "вместо просто" startActivityForResult ... "и вы вызываете setSingleTargetApplication с именем пакета приложения, которое будет вызывать сканер.

ответ

1

Попробуйте изменить линию startActivityForResult(intentScan, REQUEST_CODE);

в act.startActivityForResult(intentScan, REQUEST_CODE);

Вам не нужно комментировать код, содержащий findTargetAppPackage, просто установите пакет вашего целевого приложения с помощью вызова setSingleTargetApplication() (если вы только приложение, использующее этот библиотека)

+1

Спасибо iTech, эти две вещи были самой большой проблемой. Мне также пришлось отказаться от hardcoding Activity в переменной «intentScan» и вместо этого использовать исходный код: Intent intentScan = new Intent (BS_PACKAGE + «.SCAN»); и должен был убедиться, что BS_PACKAGE указал на пакет, в котором была CaptureActivity. СПАСИБО! – DiscDev

+1

Добро пожаловать, рад, что это сработало! – iTech

Смежные вопросы