はじめ
に Android QR コード スキャン機能の実装に関しては、インターネット上に多くの関連情報があります。比較検討した結果、プロジェクトに直接接続するために先人が改良を加えた ZXing を選択しましたが、このデモはそのプロセス全体を紹介するために特別に作成されました。
(最新の更新) この記事で説明したアクセス方法は、一部の新規開発者にとっては少し難しいため、よりアクセスしやすいコード スキャン ライブラリのライブラリ版を作成しました。 , Android に直接移動して QR コードを実装できます. スキャン機能 (5) - カプセル化と ZXing スキャン ライブラリへのアクセス。
エフェクトのプレビュー:
上の図は最初にエフェクトを示しています (シミュレーターにはカメラがないため、録音効果は良くありません。そのままにしておきます)
統合ステップ
1. このプロジェクトのデモにある com.google.zxing5 パッケージをコピーし、独自のプロジェクトに導入します。
2. このプロジェクトのデモのレイアウト activity_scanner.xml と toolbar_scanner.xml をコピーします。
3. リソース ディレクトリを raw でこのプロジェクトにコピーします。beep.ogg は、スキャンが成功したときのプロンプト音です。
4. attrs.xml/colors.xml/ids.xml の 3 つのファイルをコピーまたはマージします。
5. build.gradle ファイルへの参照を追加します。
「com.google.zxing:core:3.3.0」をコンパイルします
6. R ファイル参照パスの変更
以下の 4 つのファイルの R ファイル参照アドレスを、このプロジェクトの R を参照するように変更します。
com.google.zxing.activity.CaptureActivity
com.google.zxing.decoding.CaptureActivityHandler
com.google.zxing.decoding.DecodeHandler
com.google.zxing.view.ViewfinderView
これで統合部分は終了ですので、関数の実装方法を見てみましょう。
権限設定AndroidManifest.xml
に権限アプリケーション コードを追加します。
<uses-permission android:name="android.permission.INTERNET" /> <!-- ネットワーク許可-->
<uses-permission android:name="android.permission.VIBRATE" /> <!-- 振動許可- ->
<uses-permission android:name="android.permission.CAMERA" /> <!-- カメラの許可--> <
uses-feature android:name="android.hardware.camera.autofocus" /> <!- - オートフォーカス権限 -->
CaptureActivity を登録します。
<アプリケーション...
<アクティビティ android:name="com.google.zxing.activity.CaptureActivity"/>
</application>
Android 6.0 以降では、カメラは動的許可アプリケーション コードを追加する必要があります。これについては、以下の実装部分で説明します。
機能の実装
上記の統合が完了したら、CaptureActivity を呼び出すことで QR コード スキャン機能を実現できます。
MainActivity のソース コード部分:
public class MainActivity extends AppCompatActivityimplemented View.OnClickListener { Button btnQrCode; // 扫码 TextView tvResult; // 結果
@Override
protected void onCreate(Bundle SavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
initView();
}
private void initView() { btnQrCode = (ボタン) findViewById(R.id.btn_qrcode); btnQrCode.setOnClickListener(this);
tvResult = (TextView) findViewById(R.id.txt_result);
}
// コードのスキャンを開始
private void startQrCode() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { トースト。 makeText(MainActivity.this, "このアプリケーションのカメラ アクセス許可を開くには、許可センターにアクセスしてください", Toast.LENGTH_LONG).show(); } // 許可を申請ActivityCompat.requestPermissions( MainActivity.this , new String[] {Manifest.permission .CAMERA}, Constant.REQ_PERM_CAMERA); return; } // QR コード スキャン インテント インテント = new Intent(MainActivity.this, CaptureActivity.class);
startActivityForResult(intent, Constant.REQ_QR_CODE);
}
@Override
public void onClick(View view) { switch (view.getId()) { case R.id.btn_qrcode: startQrCode(); 壊す; } }
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //スキャン結果コールバック if (requestCode == Constant.REQ_QR_CODE && resultCode == RESULT_OK) { Bundle バンドル = data.getExtras(); String scanResult =bundle.getString(Constant.INTENT_EXTRA_KEY_QR_SCAN); //スキャンした情報を表示 tvResult.setText(scanResult); } }
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] Permissions, @NonNull int[] GrantResults) { super.onRequestPermissionsResult(requestCode, Permissions, GrantResults); switch (requestCode) { case Constant.REQ_PERM_CAMERA: // カメラ許可アプリケーション if (grantResults.length > 0 &&grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 認可を取得 startQrCode(); } else { // 認可は禁止されています Toast.makeText(MainActivity.this, "認可センターにアクセスしてくださいこのアプリのカメラアクセス権限を開くには", Toast.LENGTH_LONG).show(); }
壊す;
}
}
}
CaptureActivity を開始する前に、動的権限を申請する必要があります
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // 申请权限 ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, Constant.REQ_PERM_CAMERA); 戻る; }
アプリケーションの結果は onRequestPermissionsResult メソッドで処理されます。コメントを参照してください。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] Permissions, @NonNull int[] GrantResults) { super.onRequestPermissionsResult(requestCode, Permissions, GrantResults); switch (requestCode) { case Constant.REQ_PERM_CAMERA: // カメラ許可アプリケーション if (grantResults.length > 0 &&grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 認可を取得 startQrCode(); } else { // 認可は禁止されています Toast.makeText(MainActivity.this, "認可センターにアクセスしてくださいこのアプリのカメラのアクセス権限を開くには", Toast.LENGTH_LONG).show(); } Break; } }
スキャン結果の取得
zxing の CaptureActivity はスキャンと結果の返却を完全に実装しているため、呼び出し側で返された結果を処理するだけで済みます。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //スキャン結果コールバック if (requestCode == Constant.REQ_QR_CODE && resultCode == RESULT_OK) { Bundle バンドル = data.getExtras(); String scanResult =bundle.getString(Constant.INTENT_EXTRA_KEY_QR_SCAN); //スキャンした情報を表示 tvResult.setText(scanResult); } }
ここでは、スキャン コードの結果を表示するために TextView が使用されています。
結論:
Android コード スキャン機能はここで完成しました。カメラを呼び出すことでコードをリアルタイムでスキャンして処理し、結果をプロジェクトで直接使用できるようになります。関連するオープンソース作成者の貢献のおかげで、コード スキャン機能を統合するのは非常に簡単です。
参考文献
http://www.jianshu.com/p/e80a85b17920
ソースコードのダウンロード
ソースコードを csdn にアップロードし、必要に応じてダウンロードします。(旧バージョン)
http://download.csdn.net/detail/ahuyangdong/9915661
Github プロジェクト アドレス (常に更新)、フォト アルバム選択の適応問題は基本的に解決されました:
https://github.com/ahuyangdong/QrCodeDemo4
———————————
著作権表示: この記事はこれですCSDN ブロガー「ahuyangdong」によるオリジナルの記事であり、CC 4.0 BY-SA 著作権規約に従っています。転載する場合は、元のソースリンクとこの声明を添付してください。
元のリンク: https://blog.csdn.net/ahuyangdong/article/details/76405557
————————————
著作権表示: この記事は CSDN ブロガー「Oracle 18」のオリジナル作品です この記事CC 4.0 BY-SA 著作権契約に従います。転載する場合は、元の情報源とこの声明へのリンクを添付してください。
元のリンク: https://blog.csdn.net/weixin_72957457/article/details/126702804