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";
    @Override
    protected 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() {
        //Test
        String 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);
    }
    //点击事件
    @Override
    public 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和源码。



















