Android 熱點二維碼簡單示例
一、前言
Android 原生設置有熱點二維碼分享功能,有些系統應用也會有這個需求。
下面看看是如何實現的。
本文是一個比較簡單的內容。
二、熱點二維碼生成實現
1、效果
整個應用就一個普通的Activity,+顯示一個按鈕和二維碼圖片;
上面的輸入框默認是熱點密碼的格式,修改輸入后可以重新生成;
還添加了點擊二維碼圖片,放大效果,如下圖所示:
一般新的手機使用相機掃描可以識別連接熱點,或者wifi設置里面也可以掃描連接熱點;
上面這個二維碼也可以直接打印使用,
如果你的wifi名稱修改成test,密碼修改成12345678,別人在附近掃描這個二維碼就能連接。
2、主要知識點
(1)熱點密碼字符串格式
固定格式格式:WIFI:T:WifiType;S:WifiName;P:WifiPassword;;示例:
//加密類型:WPA2,wifi名稱:test,wifi密碼:12345678
WIFI:T:WPA2;S:test;P:12345678;;//沒有密碼的wifi:
WIFI:T:nopass;S:test;P:;;
(2)字符串生成二維碼圖片:
implementation 'com.google.zxing:core:3.4.1'
app build.gradle 導入zxing包就可以調用相關方法生成Bitmap對象放到ImageView顯示。//字符串上層二維碼Bitmap對象封裝方法:public static Bitmap createQrcode(String text) {Log.v(TAG, "createQrcode text = " + text);if (TextUtils.isEmpty(text)) {return null;}try {String contents = new String(text.getBytes("UTF-8"), "ISO-8859-1");MultiFormatWriter formatWriter = new MultiFormatWriter();BitMatrix bitMatrix = formatWriter.encode(contents, BarcodeFormat.QR_CODE, 800, 800);return bitMatrix2Bitmap(bitMatrix);} catch (Exception e) {e.printStackTrace();}return null;}
3、demo代碼
兩個類:一個Activity類和一個工具類。
(1)MainActivity.java
package com.example.qrcode;import android.app.Dialog;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity implements View.OnClickListener {EditText et_input;Button btn_create_qrcode;ImageView imageView;String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);initView();initData();initEvent();}private void initView() {btn_create_qrcode = findViewById(R.id.btn_create_qrcode);et_input = findViewById(R.id.et_input);imageView = findViewById(R.id.iv_qrcode);}private void initData() {//TestString testText = "WIFI:T:WPA2;S:test;P:12345678;;";//wifi名稱:test,密碼:12345678//String testText = QrcodeUtils.createQrcode(QrcodeUtils.getHotspotQrcodeString(this)); //熱點二維碼字符串imageView.setImageBitmap(QrcodeUtils.createQrcode(testText));et_input.setText(testText);}private void initEvent() {btn_create_qrcode.setOnClickListener(this);imageView.setOnClickListener(this);}//點擊事件@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_create_qrcode:Toast.makeText(this, "創建了二維碼", Toast.LENGTH_SHORT).show();String text = et_input.getText().toString();Log.i(TAG, "text: " + text);imageView.setImageBitmap(QrcodeUtils.createQrcode(text));break;case R.id.iv_qrcode:Toast.makeText(this, "點擊了二維碼", Toast.LENGTH_SHORT).show();View view = getLayoutInflater().inflate(R.layout.dialog_qrcode, null);ImageView imageView = view.findViewById(R.id.iv_qrcode_dialog);imageView.setImageBitmap(QrcodeUtils.createQrcode("WIFI:T:WPA2;S:test;P:12345678;;"));Dialog alertDialog = new AlertDialog.Builder(this).setView(view).create();alertDialog.show();break;}}
}
上面就是一個普通的Activity代碼,比較簡單易懂。
(2)QrcodeUtils.java
package com.example.qrcode;import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Color;
import android.util.Log;
import android.net.wifi.SoftApConfiguration;
import android.net.wifi.WifiManager;
import android.text.TextUtils;public class QrcodeUtils {private static final String TAG = QrcodeUtils.class.getSimpleName();//字符串生成Bitmap對象public static Bitmap createQrcode(String text) {Log.v(TAG, "createQrcode text = " + text);if (TextUtils.isEmpty(text)) {return null;}try {String contents = new String(text.getBytes("UTF-8"), "ISO-8859-1");MultiFormatWriter formatWriter = new MultiFormatWriter();BitMatrix bitMatrix = formatWriter.encode(contents, BarcodeFormat.QR_CODE, 800, 800);return bitMatrix2Bitmap(bitMatrix);} catch (Exception e) {e.printStackTrace();}return null;}private static Bitmap bitMatrix2Bitmap(BitMatrix matrix) {int w = matrix.getWidth();int h = matrix.getHeight();int[] rawData = new int[w * h];for (int i = 0; i < w; i++) {for (int j = 0; j < h; j++) {int color = Color.WHITE;if (matrix.get(i, j)) {color = Color.BLACK;}rawData[i + (j * w)] = color;}}Bitmap bitmap = Bitmap.createBitmap(w, h, Config.RGB_565);bitmap.setPixels(rawData, 0, w, 0, 0, w, h);return bitmap;}//獲取熱點二維碼規則的字符串public static String getHotspotQrcodeString(Context context) {WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);if (wifiManager == null) {return null;}SoftApConfiguration config = wifiManager.getSoftApConfiguration(); //getSoftApConfiguration()方法需要導入framework jar包才能章程編過String wifiName = "";String wifiPassWord = "";wifiName = config.getSsid();wifiPassWord = config.getPassphrase();int securityType = config.getSecurityType();String security = "WPA2";//判斷是否設置了熱點密碼,如果未設置熱點密碼不用設置密碼字符串if (securityType == SoftApConfiguration.SECURITY_TYPE_OPEN) {wifiPassWord = "";security = "nopass";}StringBuilder build = new StringBuilder();build.append("WIFI:T:").append(security).append(";S:").append(wifiName).append(";P:").append(wifiPassWord).append(";;");return build.toString();}}
上面就是一個工具類,主要包含兩個工具方法:
一個是字符串創建二維碼Bitmap對象;
一個是獲取熱點二維碼的字符串;
(3)熱點二維碼
上面的demo代碼,默認是普通字符串的二維碼生成;
如果要換成本機設備的熱點二維碼的生成,把字符串生成的方法替換成 getHotspotQrcodeString()方法就行;
但是要注意的是熱點信息的獲取是要系統簽名權限的;
所以要熱點字符串生成導入系統簽名的jks;
并且需要在AndroidManifest中聲明uid:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:sharedUserId="android.uid.system">
還有就是要添加權限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
還有就是要導入系統的framework 的jar包:
未導入系統jar包下面的代碼會編譯錯誤:
WifiManager.getSoftApConfiguration();
4、擴展一下
其實不僅僅是手機熱點的wifi可以用二維碼,普通的wifi也是可以使用二維碼;
只要把上面的賬號和密碼替換就行;后面就可以提供二維碼給別人進行掃描連接wifi;
所以在現實場景中也可以提前生成對應的wifi名稱和密碼的二維碼,保留使用;
特別是很長的wifi名稱或者密碼的情況,使用二維碼掃描連接更加方便。
5、資源下載
項目代碼和apk應用代碼下載路徑:
https://download.csdn.net/download/wenzhi20102321/90640480
apk可以直接下載安裝使用;可以定制自己需要的wifi賬號和密碼的二維碼圖片。
三、其他
1、Android 熱點二維碼簡單示例小結
(1)熱點二維碼固定格式格式:WIFI:T:WifiType;S:WifiName;P:WifiPassword;;
(2)生成二維碼圖片使用zxing包的相關類
(3)如果應用需要生成設備當時的熱點二維碼圖片,需要系統簽名權限命令
手機聯系人的二維碼呢?也是這樣的二維碼嗎?
其實這些碼都不一樣,像微信個人二維碼,挪車碼,支付寶的碼,
這些二維碼都是包含網址和相關信息的,需要通過具體服務器校驗才能跳轉到另外界面。
2、之前的二維碼和熱點介紹
Android二維碼圖片生成和二維碼掃描軟件的設計
https://blog.csdn.net/wenzhi20102321/article/details/53316179
Android 熱點分享二維碼功能簡單介紹
https://blog.csdn.net/wenzhi20102321/article/details/142603112
之前沒介紹這么具體,并且沒有提供到apk和源碼。