0

QR コードをデコードし、Android アプリケーションのコードに含まれる文字を返すメソッドを実装しています。QR コードが正常にデコードされ、null 値が返されなくなるまで、このメソッドを実行したいと思います。

1周目で正常に動きます。しかし、1 ループ目で読み取りに失敗すると、2 ループ目以降はほとんどコードをデコードしません。また、無限ループに陥ることもあります。

何かコツがあれば教えてください。

public String readQRCode(Bitmap file) {
    Reader reader = new MultiFormatReader();
    Result result = null;
    do {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, REQUEST_IMAGE);
        Toast.makeText(this, "Please try again", Toast.LENGTH_LONG).show();

        LuminanceSource source = new RGBLuminanceSource(file);
        BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(
                source));
        // Decode
        try {
            result = reader.decode(binaryBitmap);
        } catch (NotFoundException e) {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, REQUEST_IMAGE);
            Toast.makeText(this, "Please try again", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        } catch (ChecksumException e) {
            e.printStackTrace();
        } catch (FormatException e) {
            e.printStackTrace();
        }
    } while (result == null || result.getText() == null);

    return result.getText();
}
4

1 に答える 1

1

忙しい待機ループのように見えるものを作成しました。ロジックを完全に書き直す必要があります。

startActivityForResult は値を返さないため、アクティビティを呼び出したのと同じメソッドで結果を処理しないでください。onActivityResult で処理を行う必要があります。

こちらのドキュメントを参照してください: http://developer.android.com/reference/android/app/Activity.html#StartingActivities

あなたの場合:

  • ループを削除し、readQRCode の「結果」で何もしないでください
  • onActivityResult メソッドを追加し、そこに startActivityForResult の後に続くすべてのことを行います
  • ループしたい場合は、startActivityForResult から readQRCode を呼び出します

最終結果には、いかなる種類のループも含まれてはなりません。

ところで: コードを修正してほしい場合は、現在の startActivityForResult の内容も確認する必要があります。

于 2012-07-27T14:26:14.060 に答える