1

この回答を使用して、ZXing ソース コード (ZXing v2.1) を含むスタンドアロンの Android ライブラリ プロジェクトを作成しました。正常にコンパイルされ、CaptureActivity を実行すると、期待どおりに QR コードを読み取ることができます。

このライブラリを取得したい別の Android プロジェクトがあります。そのライブラリ関係を正しく設定しました。

私が抱えている問題は、IntentIntegrator を介して ZXing スキャナーのローカル コピーを起動する方法です (ここで説明)。

CaptureActivity のローカル コピーを使用するように IntentIntegrator.initiateScan() メソッドを変更してみました。これにより、QR スキャナーが適切に読み込まれます。 ただし、QR コードがスキャンされると、onActivityResult で呼び出し元のアクティビティに結果を返す代わりに、QR 情報が画面に表示されます。

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..." の代わりに "act.startActivityForResult..." を呼び出していること、および setSingleTargetApplication を呼び出しているアプリケーションのパッケージ名で呼び出すことです。スキャナー。

4

1 に答える 1

1

ラインを変えてみるstartActivityForResult(intentScan, REQUEST_CODE);

act.startActivityForResult(intentScan, REQUEST_CODE);

を含むコードにコメントを付ける必要はありません。findTargetAppPackage呼び出してターゲット アプリケーションのパッケージを設定するsetSingleTargetApplication()だけです (このライブラリを使用する唯一のアプリケーションである場合)。

于 2013-02-17T21:10:23.020 に答える