外部アプリケーション(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 Studioは、シンボルを解決できないと言っています:.Android.CaptureActivity
そしてこれを実行するとエラーが発生しました
Java.lang.ClassNotFoundException:クラス「com.google.zxing.client.Android.CaptureActivity」が見つかりませんでした
どうした?
なぜそれが起こったのかはわかりませんが、最終的には別のライブラリを使用します。 Zxing-Android-minimal と here および here のチュートリアルを使用します。今では動作します。
すでに回答済みですが、ANTのような自動インストール方法を使用せずにZXingをライブラリとして使用したい人には、徹底したソリューションのように感じます。
ZXingはオープンソースプロジェクトであるため(ZXingのWebサイトで説明されているように)、ユーザーのデバイスにサードパーティのアプリケーションを強制的にインストールするのではなく、その機能をプロジェクトライブラリとして使用できます。
この方法は作成者に受け入れられ、コードをコピーするのではなく、プロジェクトのライブラリとして使用するだけなので、使用条件に違反しないことに注意することが重要です。
一般的なプロセスは次のとおりです。
Eclipseを使用している場合の完全な詳細手順を以下に示します(Studioでも非常に簡単に実装できます)。
ZXingソースコードとコアファイルのダウンロード
ZXingプロジェクトをEclipseにインポートする
ワークスペースにキャプチャアクティビティが表示されます。使用している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をライブラリとして定義し、コードを修正する
ZXingのバージョンによっては、Eclipseがエラーを含むJavaファイルの一部をマークする場合があります。この場合、Android _に一致するようにコードを修正する必要がありますJavaバージョン、それ以外の場合は単に次の章に移動します
8.1。壊れた各Javaファイルをエディターで開き、壊れたSwitchステートメントをIf Elseステートメントのチェーンに置き換えます。これは私が知っている厄介な部分です。
独自のプロジェクトのライブラリとして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/
これまでに見つけたすべての回答はEclipseに基づいており、現時点ではかなり古いため、Android Studio(2.1.2)のスタンドアロンライブラリとしてZXingを追加する回答を追加します。
コンパイルされたプロジェクトをGithubに配置しました https://github.com/tarun0/ZXing-Standalone-library プロジェクトにzxing_standalone
モジュールを追加するだけで、行く。詳細について、または新しいバージョン用にコンパイルするには、読み続けてください。
長い手順のように思えるかもしれませんが、一度実行すると、非常に簡単で短いことがわかります。
Android
ディレクトリのみが必要です。したがって、このフォルダーが既にある場合は、サイズが約126MBのブランチ全体をダウンロードする必要はありません。core-x.x.x.jar
をダウンロードしますProject Explorer
からProject
を選択します(画像を参照)New
> Module
> Import Gradle Project
を選択します。次に、ダウンロードしたソースコードからAndroid
ディレクトリを選択します(ステップ1)。 (絶対的な初心者については、以下の参照写真)。必要に応じて、名前を変更し、インポートのデフォルト設定のままにします。 libs
を作成し、ステップ2でダウンロードしたcore.jar
ファイルをこのフォルダーに入れます。次に、ファイルメニューからProject Structure
を開き、このcore.jar
ファイルを依存関係として追加します。CameraConfigurationalUtils.Java をダウンロードして、プロジェクトに貼り付けます。
次に、インポートしたプロジェクトのgradleファイルにいくつかの変更を加えます。 apply plugin: 'com.Android.application'
をapply plugin: 'com.Android.library'
に変更して、システムがライブラリーであることをシステムに伝えます。そして、applicationId ...
ステートメントを削除します。
インポートしたプロジェクトのManifest.xml
ファイルで、次の変更を行います。 <application...
タグで、Android:icon...
とAndroid:logo...
を削除し、インテントフィルターからこの<category Android:name="Android.intent.category.LAUNCHER"/>
を削除するこれを削除しないと、2つのランチャーアクティビティが発生します)。
プロジェクトのbuild.gradle
ファイルのdependencies
ブロックで、この行を追加しますcompile project (':Android')
ここで、Android
をステップ4でプロジェクトのインポート中に選択した名前に置き換えますプロジェクトをクリーンアップします。 switch
ステートメントにいくつかのエラーが表示されます。これらのスイッチケースをクリックし、Android Studioが提供するオプション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の回答。
私は本当に遅れていますが、後で誰かに助けられるようにこれについて返信したいと思います。これは、上記の方法と解決策が間違っていると言うことではありません。開発者にとってより良い方法を選択するための追加情報です。 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があります:
私のコードでは、このバージョンに到達しました:
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;
これが誰かの助けになることを願っています。
アントニーノ
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);
お役に立てれば。
このスレッドは古いのですが、私はこの問題にちょうど出てきました。そのため、Android Studioを使用しており、コアクラスを統合したい他の人に投稿しています。必要なのは、この依存関係を追加するだけです
implementation 'com.google.zxing:core:x.x.x'
Android Studioは、上記の最新バージョンを自動的に提案します。