转载自:https://www.jianshu.com/p/de972f5652db
Ⅰ. 二维码扫描
(1)配置
① 在model下build.gradle
implementation 'com.journeyapps:zxing-android-embedded:3.6.0' implementation 'com.google.zxing:core:3.3.0'
②在AndroidManifest.xml中添加权限
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.FLASHLIGHT" />
(2)使用
① xml布局
activity_main.xml :
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="开始" /> <TextView android:id="@+id/text_result" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:textSize="30sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </LinearLayout>
activity_scan.xml :
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.journeyapps.barcodescanner.DecoratedBarcodeView android:id="@+id/dbv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentStart="true" app:zxing_scanner_layout="@layout/content_scan" android:layout_alignParentLeft="true"></com.journeyapps.barcodescanner.DecoratedBarcodeView> <!--这个是闪光灯的开启按键,我这里不需要就gone了--> <ImageButton android:id="@+id/button_led" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="60dp" android:visibility="gone" android:background="@drawable/ic_launcher_background" /> </RelativeLayout>
content_scan.xml:
<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <com.journeyapps.barcodescanner.BarcodeView android:id="@+id/zxing_barcode_surface" android:layout_width="wrap_content" android:layout_height="wrap_content" app:zxing_framing_rect_height="250dp" app:zxing_framing_rect_width="250dp" /> <com.journeyapps.barcodescanner.ViewfinderView android:id="@+id/zxing_viewfinder_view" android:layout_width="wrap_content" android:layout_height="wrap_content" app:zxing_possible_result_points="@color/zxing_custom_possible_result_points" app:zxing_result_view="@color/zxing_custom_result_view" app:zxing_viewfinder_laser="@color/zxing_custom_viewfinder_laser" app:zxing_viewfinder_mask="@color/zxing_custom_viewfinder_mask" /> <TextView android:id="@+id/zxing_status_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center_horizontal" android:background="@color/zxing_transparent" android:text="@string/zxing_msg_default_status" android:textColor="@color/zxing_status_text" /> </merge>
② activity使用
public class MainActivity extends AppCompatActivity { private Button button1; private TextView text_result; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = findViewById(R.id.button1); text_result = findViewById(R.id.text_result); requsetPermission(); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /*以下是启动我们自定义的扫描活动*/ IntentIntegrator intentIntegrator = new IntentIntegrator(MainActivity.this); intentIntegrator.setBeepEnabled(true); /*设置启动我们自定义的扫描活动,若不设置,将启动默认活动*/ intentIntegrator.setCaptureActivity(ScanActivity.class); intentIntegrator.initiateScan(); } }); } /** * 在oncreate中调用即可 */ private void requsetPermission() { if (Build.VERSION.SDK_INT > 22) { if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { //先判断有没有权限 ,没有就在这里进行权限的申请 ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.CAMERA}, 1); } else { } } else { } } /** * 权限回调 * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case 1: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //这里已经获取到了摄像头的权限,想干嘛干嘛了可以 } else { //这里是拒绝给APP摄像头权限,给个提示什么的说明一下都可以。 Toast.makeText(MainActivity.this, "请手动打开相机权限", Toast.LENGTH_SHORT).show(); } break; default: break; } } /** * 二维码扫描回调 * @param requestCode * @param resultCode * @param data */ @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); if (result != null) { if (result.getContents() == null) { Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show(); text_result.setText(result.getContents()); //显示二维码扫描到的信息 } } else { super.onActivityResult(requestCode, resultCode, data); } } }
③ 二维码界面类ScanActivity.java
public class ScanActivity extends AppCompatActivity { private CaptureManager capture; private ImageButton buttonLed; private DecoratedBarcodeView barcodeScannerView; private boolean bTorch = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); barcodeScannerView = initializeContent(); buttonLed = findViewById(R.id.button_led); /*根据闪光灯状态设置imagebutton*/ barcodeScannerView.setTorchListener(new DecoratedBarcodeView.TorchListener() { @SuppressLint("NewApi") @Override public void onTorchOn() { //闪光灯按钮的背景图片,随便用的,自己需要的替换 buttonLed.setBackground(getResources().getDrawable(R.drawable.ic_launcher_background)); bTorch = true; } @SuppressLint("NewApi") @Override public void onTorchOff() { //闪光灯按钮的背景图片,随便用的,自己需要的替换 buttonLed.setBackground(getResources().getDrawable(R.drawable.ic_launcher_background)); bTorch = false; } }); /*开关闪光灯*/ buttonLed.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (bTorch) { barcodeScannerView.setTorchOff(); } else { barcodeScannerView.setTorchOn(); } } }); capture = new CaptureManager(this, barcodeScannerView); capture.initializeFromIntent(getIntent(), savedInstanceState); capture.decode(); } /** * Override to use a different layout. * * @return the DecoratedBarcodeView */ protected DecoratedBarcodeView initializeContent() { setContentView(R.layout.activity_scan); return (DecoratedBarcodeView) findViewById(R.id.dbv); } @Override protected void onResume() { super.onResume(); capture.onResume(); } @Override protected void onPause() { super.onPause(); capture.onPause(); barcodeScannerView.setTorchOff(); } @Override protected void onDestroy() { super.onDestroy(); capture.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); capture.onSaveInstanceState(outState); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { capture.onRequestPermissionsResult(requestCode, permissions, grantResults); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return barcodeScannerView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event); } }
④ 记得在AndroidManifest.xml中添加跳转的activity
<activity android:name=".ScanActivity"/>
Ⅱ. 生成二维码
/** * 生成二维码 * * @param url 你要加入到二维码中的信息 */ private void createQRcodeImage(String url) { //获取控件的大小 ViewGroup.LayoutParams para = ivList.get(1).getLayoutParams(); width = para.width; height = para.height; try { //判断URL合法性 if (url == null || "".equals(url) || url.length() < 1) { return; } Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); //图像数据转换,使用了矩阵转换 BitMatrix bitMatrix = new QRCodeWriter().encode(url, BarcodeFormat.QR_CODE, width, height, hints); int[] pixels = new int[width * height]; //下面这里按照二维码的算法,逐个生成二维码的图片, //两个for循环是图片横列扫描的结果 for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (bitMatrix.get(x, y)) { pixels[y * width + x] = 0xff000000; } else { pixels[y * width + x] = 0xffffffff; } } } //生成二维码图片的格式,使用ARGB_8888 Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, width, 0, 0, width, height); //显示到我们的ImageView上面 ivList.get(1).setImageBitmap(bitmap); } catch (WriterException e) { e.printStackTrace(); } }
至此,END。