web-dev-qa-db-ja.com

実際のzxingアプリをインストールせずにZxingバーコードスキャナーを統合する方法(シンボル:.Android.CaptureActivityを解決できません)?

外部アプリケーション(Playストアのzxingスキャナー)を必要とせずに、zxingスキャナーをアプリに統合したい。これは私のコードです

Button scan = (Button) findViewById(R.id.scan_button);
scan.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent("com.google.zxing.client.Android.SCAN");
        intent.setPackage("com.mypackage.app");
        intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
        startActivityForResult(intent, SCANNER_REQUEST_CODE);
    }
});

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == SCANNER_REQUEST_CODE) {
        // Handle scan intent
        if (resultCode == Activity.RESULT_OK) {
            // Handle successful scan
            String contents = intent.getStringExtra("SCAN_RESULT");
            String formatName = intent.getStringExtra("SCAN_RESULT_FORMAT");
            byte[] rawBytes = intent.getByteArrayExtra("SCAN_RESULT_BYTES");
            int intentOrientation = intent.getIntExtra("SCAN_RESULT_ORIENTATION", Integer.MIN_VALUE);
            Integer orientation = (intentOrientation == Integer.MIN_VALUE) ? null : intentOrientation;
            String errorCorrectionLevel = intent.getStringExtra("SCAN_RESULT_ERROR_CORRECTION_LEVEL");

        } else if (resultCode == Activity.RESULT_CANCELED) {
            // Handle cancel
        }
    } else {
        // Handle other intents
    }

}

AndroidManifest.xml

<activity Android:name="com.google.zxing.client.Android.CaptureActivity"
    Android:screenOrientation="landscape"
    Android:configChanges="orientation|keyboardHidden"
    Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen"
    Android:windowSoftInputMode="stateAlwaysHidden">
    <intent-filter>
        <action Android:name="com.google.zxing.client.Android.SCAN"/>
        <category Android:name="Android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

私のAndroid St​​udioは、シンボルを解決できないと言っています:.Android.CaptureActivityそしてこれを実行するとエラーが発生しました

Java.lang.ClassNotFoundException:クラス「com.google.zxing.client.Android.CaptureActivity」が見つかりませんでした

どうした?

31
stackex

なぜそれが起こったのかはわかりませんが、最終的には別のライブラリを使用します。 Zxing-Android-minimalhere および here のチュートリアルを使用します。今では動作します。

29
stackex

すでに回答済みですが、ANTのような自動インストール方法を使用せずにZXingをライブラリとして使用したい人には、徹底したソリューションのように感じます。

ZXingはオープンソースプロジェクトであるため(ZXingのWebサイトで説明されているように)、ユーザーのデバイスにサードパーティのアプリケーションを強制的にインストールするのではなく、その機能をプロジェクトライブラリとして使用できます。

この方法は作成者に受け入れられ、コードをコピーするのではなく、プロジェクトのライブラリとして使用するだけなので、使用条件に違反しないことに注意することが重要です。

一般的なプロセスは次のとおりです。

  1. ZXingのソースコードとコアファイルをダウンロードします。
  2. ZXingプロジェクトを任意の環境にインポートする(Eclipse/Studio)
  3. ライブラリとして機能するZXingプロジェクトを定義し、これらの要件を満たすようにコードを修正します。
  4. 独自のプロジェクトのビルドパスにZXingを追加する
  5. アプリケーションの必要に応じてZXingメソッドを追加します。

Eclipseを使用している場合の完全な詳細手順を以下に示します(Studioでも非常に簡単に実装できます)。

ZXingソースコードとコアファイルのダウンロード

  1. ZXingのGitHubプロジェクトページ( https://github.com/zxing/zxing )に移動し、[Zipのダウンロード]をクリックします。
  2. ファイルを抽出します(他のライブラリソースのほとんどが配置されている場所を使用することをお勧めします)

ZXingプロジェクトをEclipseにインポートする

  1. Eclipseを開きます。
  2. [ファイル]、[インポート]、[Android]、[既存のAndroid Code Into Workspace]の順にクリックし、選択ウィンドウからZXing Zipファイルを抽出したフォルダーに移動して、[Android]フォルダーを選択します。これで、Eclipseは「captureActivity」というプロジェクトを含むフォルダーを検出し、そのプロジェクトをインポートします。
  3. ワークスペースにキャプチャアクティビティが表示されます。使用しているZXingのバージョンによっては、core.jarファイルをZXingプロジェクトに割り当てる必要があります。これがご使用のバージョンに該当するかどうかを確認するには、captureActivityプロジェクトのlibsフォルダーを開き、core.jarファイルが存在するかどうかを確認します自分で追加する必要がある場合は、次の章に進んでください。

    5.1。 core.jarファイルを追加するには、EclipseワークスペースでcaptureActivityプロジェクトを右クリックし、「ビルドパス」>「ビルドパスの構成」を選択します。

    5.2。サイドメニューから[Java Build Path]を選択し、[ライブラリ]タブをクリックします。

    5.3。「外部JARの追加」をクリックし、ZXing Zipを最初にエクスポートした場所に移動します。

    5.4。コアフォルダーを入力し、core.jarを選択し(名前はZXingバージョンによって異なる場合があります)、開くをクリックします

    5.5。ビルドパスリストにcore.jarが表示されます。[注文とエクスポート]タブをクリックして、core.jarを確認します。

ZXingをライブラリとして定義し、コードを修正する

  1. まだビルドパスウィンドウを開いていない場合は、captureActivityプロジェクトを右クリックし、[ビルドパス]> [ビルドパスの構成]を選択します。
  2. サイドメニューからAndroidを選択し、[ライブラリー]をオンにし、Okをクリックしてウィンドウを終了します
  3. ZXingのバージョンによっては、Eclipseがエラーを含むJavaファイルの一部をマークする場合があります。この場合、Android _に一致するようにコードを修正する必要がありますJavaバージョン、それ以外の場合は単に次の章に移動します

    8.1。壊れた各Javaファイルをエディターで開き、壊れたSwitchステートメントをIf Elseステートメントのチェーンに置き換えます。これは私が知っている厄介な部分です。

独自のプロジェクトのライブラリとしてZXingを追加します

  1. すべてが正常になった場合、captureActivityはワークスペースの通常のプロジェクトフォルダーのように表示され、エラーも赤も表示されません!符号。 ZXingを独自のプロジェクトのライブラリとして定義するには、ワークスペースでプロジェクトを右クリックし、ビルドパス>ビルドパスの構成を選択します。
  2. サイドメニューから[Android]を選択します。ウィンドウの右下にある[追加]ボタンをクリックし、ウィンドウからcaptureActivityを選択します。
  3. それで、サードパーティのインストールを必要とせずに、プロジェクトでZXingを独立したライブラリとして使用できるようになりました。

アプリケーションに必要なZXingのメソッドを追加する

このパートは実際にはガイドではありませんが、これまでのところ私自身のニーズに役立つと思ったのは、主に使用する2つの方法です。

スキャナーを実行してQRコードをキャプチャします。

Intent intent = new Intent(getApplicationContext(),CaptureActivity.class);
intent.setAction("com.google.zxing.client.Android.SCAN");
intent.putExtra("SAVE_HISTORY", false);
startActivityForResult(intent, 0);

OnActivityResult()でスキャンの結果を取得する:

if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = data.getStringExtra("SCAN_RESULT");
Log.d(TAG, "contents: " + contents);
} else if (resultCode == RESULT_CANCELED) {
// Handle cancel
Log.d(TAG, "RESULT_CANCELED");
}
}

Androidキャプチャアクティビティの他のアクティビティと同様に、プロジェクトマニフェストでも定義する必要があることに注意してください。また、次のようにカメラを使用するプロジェクトの許可を与える必要があります。

<uses-permission Android:name="Android.permission.CAMERA" />
<activity
Android:name="com.google.zxing.client.Android.CaptureActivity"
Android:screenOrientation="landscape" >
</activity>

これにより、他の人が数時間の研究を節約できることを願っています。

追加のボーナスとして、私は読むことをお勧めします: https://biocram.wordpress.com/2013/06/11/integrate-zxing-as-a-library-inside-an-Android-project/

46
Liran Cohen

これまでに見つけたすべての回答はEclipseに基づいており、現時点ではかなり古いため、Android St​​udio(2.1.2)のスタンドアロンライブラリとしてZXingを追加する回答を追加します。

コンパイルされたプロジェクトをGithubに配置しました https://github.com/tarun0/ZXing-Standalone-library プロジェクトにzxing_standaloneモジュールを追加するだけで、行く。詳細について、または新しいバージョン用にコンパイルするには、読み続けてください。

長い手順のように思えるかもしれませんが、一度実行すると、非常に簡単で短いことがわかります。

  1. ZXingライブラリのソースコードを https://github.com/zxing/zxing/ からダウンロードします。これには、Androidディレクトリのみが必要です。したがって、このフォルダーが既にある場合は、サイズが約126MBのブランチ全体をダウンロードする必要はありません。
  2. http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/ から最新のcore-x.x.x.jarをダウンロードします
  3. Androidプロジェクトを独自のプロジェクトに追加します。これを行うには、最初にProject ExplorerからProjectを選択します(画像を参照)

enter image description here

  1. ここでプロジェクトをクリックしてから右クリックし、New> Module> Import Gradle Projectを選択します。次に、ダウンロードしたソースコードからAndroidディレクトリを選択します(ステップ1)。 (絶対的な初心者については、以下の参照写真)。必要に応じて、名前を変更し、インポートのデフォルト設定のままにします。 enter image description here
  2. このインポートされたプロジェクトで、フォルダーlibsを作成し、ステップ2でダウンロードしたcore.jarファイルをこのフォルダーに入れます。次に、ファイルメニューからProject Structureを開き、このcore.jarファイルを依存関係として追加します。

enter image description hereIn step 2 Select <code>Add file dependency</code>

  1. CameraConfigurationalUtils.Java をダウンロードして、プロジェクトに貼り付けます。 enter image description here

  2. 次に、インポートしたプロジェクトのgradleファイルにいくつかの変更を加えます。 apply plugin: 'com.Android.application'apply plugin: 'com.Android.library'に変更して、システムがライブラリーであることをシステムに伝えます。そして、applicationId ...ステートメントを削除します。

  3. インポートしたプロジェクトのManifest.xmlファイルで、次の変更を行います。 <application...タグで、Android:icon...Android:logo...を削除し、インテントフィルターからこの<category Android:name="Android.intent.category.LAUNCHER"/>を削除するこれを削除しないと、2つのランチャーアクティビティが発生します)。

  4. プロジェクトのbuild.gradleファイルのdependenciesブロックで、この行を追加しますcompile project (':Android')ここで、Androidをステップ4でプロジェクトのインポート中に選択した名前に置き換えますプロジェクトをクリーンアップします。 switchステートメントにいくつかのエラーが表示されます。これらのスイッチケースをクリックし、Android St​​udioが提供するオプションreplace with ifオプションを選択します。

それでおしまい。これで、独自のアプリでZXingライブラリを使用できます。 :)

追加したライブラリを使用するには、上記の最初の回答(同じコードのみをコピーする)で述べたIntentsを使用します。

スキャン中(ボタンをクリックするときなど)、Intentを送信します。

Intent intent = new Intent(getApplicationContext(),CaptureActivity.class);
intent.setAction("com.google.zxing.client.Android.SCAN");
intent.putExtra("SAVE_HISTORY", false);
startActivityForResult(intent, 0);

次に、OnActivityResultで:

if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = data.getStringExtra("SCAN_RESULT");
Log.d(TAG, "contents: " + contents);
} else if (resultCode == RESULT_CANCELED) {
// Handle cancel
Log.d(TAG, "RESULT_CANCELED");
}
}

私はできるだけ説明的になろうとしました。人々がそれを役に立つと思うことを願っています。

自分のアプリへのコードのコピーに関するコードの作者の一人がこの回答を読んでください: https://stackoverflow.com/a/9942761

参照: https://stackoverflow.com/a/29818279https://stackoverflow.com/a/29960361 その他のいくつかのブログ/ SOの回答。

39
T.M

私は本当に遅れていますが、後で誰かに助けられるようにこれについて返信したいと思います。これは、上記の方法と解決策が間違っていると言うことではありません。開発者にとってより良い方法を選択するための追加情報です。 1つの道よりも千通りの道のほうがいい。

だから、私たちのgradleに始めて追加してみましょう

compile 'com.journeyapps:zxing-Android-embedded:3.2.0@aar'
compile 'com.google.zxing:core:3.2.1'

次のようなモジュールの呼び出し(例:ボタンのクリック時):

IntentIntegrator integrator = new IntentIntegrator(Home.this);
            integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);
            integrator.setPrompt("Scan Code");
            integrator.setCameraId(0);
            integrator.setBeepEnabled(true);
            integrator.setBarcodeImageEnabled(false);
            integrator.initiateScan();

次のような結果を取得します。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if(intentResult != null) {
        if(intentResult.getContents() == null) {
            Log.d("MainActivity", "Cancelled");
            Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();

        } else {
            Log.d("MainActivity", "Scanned");
            Toast.makeText(this, "Scanned: " + intentResult.getContents(), Toast.LENGTH_LONG).show();
        }
    }

}

詳細については、リンクを確認できます https://github.com/pethoalpar/ZxingExample

私のような瓶を見つけるのに問題がある場合は、ここにURLがあります:

http://repo1.maven.org/maven2/com/google/zxing/

3
Julián Vega

私のコードでは、このバージョンに到達しました:

Camera.PreviewCallback myCallBack = new Camera.PreviewCallback() {
   @Override public void onPreviewFrame(byte[] data, Camera camera)
   {
      Camera.Parameters parameters = camera.getParameters();
      int width = parameters.getPreviewSize().width;
      int height = parameters.getPreviewSize().height;
      int format = parameters.getPreviewFormat();
      LuminanceSource source = null;
      if(format == ImageFormat.NV21) //YCbCr_420_SP)
      {
         source = new PlanarYUVLuminanceSource(imgData, bitmapWidth, bitmapHeight, 0,0, bitmapWidth,bitmapHeight, false);
      } else
      {
         throw new UnsupportedOperationException("Unsupported image format ");
      }
      BinaryBitmap bBitmap = new BinaryBitmap(new HybridBinarizer(source));
      try
      {
         Result result = reader.decode(bBitmap);
         txt.setText(result.getText())
      } catch (NotFoundException e)
      {
         //txt.setText("");
      }
   }
};

import Android.hardware.Camera;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.PlanarYUVLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;

Camera mCamera;
MultiFormatReader reader;
TextView txt;

これが誰かの助けになることを願っています。

アントニーノ

3
Perry

Stackexの回答の詳細...任意の名前のアクティビティを作成します。

public class CaptureActivityAnyOrientation extends CaptureActivity {
}

マニフェストで目的の方向を定義するか、下のようにして、横向きと縦向きの両方で機能するようにします。

<activity Android:name=".CaptureActivityAnyOrientation"
      Android:screenOrientation="fullSensor"
      Android:stateNotNeeded="true"
      Android:theme="@style/zxing_CaptureTheme"
      Android:windowSoftInputMode="stateAlwaysHidden"/>

最後に、setCaptureActivityとして作成されたアクティビティを使用します。

IntentIntegrator.forSupportFragment(fragment)
                    .setCaptureActivity(CaptureActivityAnyOrientation.class)
                    .setOrientationLocked(false)
                    .setBeepEnabled(true)
                    .addExtra("Prompt_MESSAGE", "Scan QR Code")
                    .initiateScan(IntentIntegrator.QR_CODE_TYPES);

お役に立てれば。

2

Eclipseで機能する方法を次に示します。

Eclipse Android appのZXing統合

幸せな統合!

0
Hubert Solecki

このスレッドは古いのですが、私はこの問題にちょうど出てきました。そのため、Android St​​udioを使用しており、コアクラスを統合したい他の人に投稿しています。必要なのは、この依存関係を追加するだけです

implementation 'com.google.zxing:core:x.x.x'

Android Studioは、上記の最新バージョンを自動的に提案します。

0
Aziz