Android 热点二维码简单示例

张春  论坛元老 | 2025-4-22 18:34:19 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1762|帖子 1762|积分 5286

Android 热点二维码简单示例

一、前言

Android 原生设置有热点二维码分享功能,有些系统应用也会有这个需求。
下面看看是怎样实现的。
本文是一个比较简单的内容。
二、热点二维码生成实现

1、效果


整个应用就一个普通的Activity,+表现一个按钮和二维码图片;
上面的输入框默认是热点暗码的格式,修改输入后可以重新生成;
还添加了点击二维码图片,放大效果,如下图所示:

一般新的手机利用相机扫描可以识别毗连热点,或者wifi设置里面也可以扫描毗连热点;
上面这个二维码也可以直接打印利用,
假如你的wifi名称修改成test,暗码修改成12345678,别人在附近扫描这个二维码就能毗连。
2、主要知识点

(1)热点暗码字符串格式

  1. 固定格式格式:WIFI:T:WifiType;S:WifiName;P:WifiPassword;;
  2. 示例:
  3. //加密类型:WPA2,wifi名称:test,wifi密码:12345678
  4. WIFI:T:WPA2;S:test;P:12345678;;
  5. //没有密码的wifi:
  6. WIFI:T:nopass;S:test;P:;;
复制代码
(2)字符串生成二维码图片:

  1. implementation 'com.google.zxing:core:3.4.1'
  2. app build.gradle 导入zxing包就可以调用相关方法生成Bitmap对象放到ImageView显示。
  3.         //字符串上层二维码Bitmap对象封装方法:
  4.     public static Bitmap createQrcode(String text) {
  5.         Log.v(TAG, "createQrcode text = " + text);
  6.         if (TextUtils.isEmpty(text)) {
  7.             return null;
  8.         }
  9.         try {
  10.             String contents = new String(text.getBytes("UTF-8"), "ISO-8859-1");
  11.             MultiFormatWriter formatWriter = new MultiFormatWriter();
  12.             BitMatrix bitMatrix = formatWriter.encode(contents, BarcodeFormat.QR_CODE, 800, 800);
  13.             return bitMatrix2Bitmap(bitMatrix);
  14.         } catch (Exception e) {
  15.             e.printStackTrace();
  16.         }
  17.         return null;
  18.     }
复制代码
3、demo代码

两个类:一个Activity类和一个工具类。
(1)MainActivity.java

  1. package com.example.qrcode;
  2. import android.app.Dialog;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.View;
  6. import android.widget.Button;
  7. import android.widget.EditText;
  8. import android.widget.ImageView;
  9. import android.widget.Toast;
  10. import androidx.activity.EdgeToEdge;
  11. import androidx.appcompat.app.AlertDialog;
  12. import androidx.appcompat.app.AppCompatActivity;
  13. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  14.     EditText et_input;
  15.     Button btn_create_qrcode;
  16.     ImageView imageView;
  17.     String TAG = "MainActivity";
  18.     @Override
  19.     protected void onCreate(Bundle savedInstanceState) {
  20.         super.onCreate(savedInstanceState);
  21.         EdgeToEdge.enable(this);
  22.         setContentView(R.layout.activity_main);
  23.         initView();
  24.         initData();
  25.         initEvent();
  26.     }
  27.     private void initView() {
  28.         btn_create_qrcode = findViewById(R.id.btn_create_qrcode);
  29.         et_input = findViewById(R.id.et_input);
  30.         imageView = findViewById(R.id.iv_qrcode);
  31.     }
  32.     private void initData() {
  33.         //Test
  34.         String testText = "WIFI:T:WPA2;S:test;P:12345678;;";//wifi名称:test,密码:12345678
  35.         //String testText = QrcodeUtils.createQrcode(QrcodeUtils.getHotspotQrcodeString(this)); //热点二维码字符串
  36.         imageView.setImageBitmap(QrcodeUtils.createQrcode(testText));
  37.         et_input.setText(testText);
  38.     }
  39.     private void initEvent() {
  40.         btn_create_qrcode.setOnClickListener(this);
  41.         imageView.setOnClickListener(this);
  42.     }
  43.     //点击事件
  44.     @Override
  45.     public void onClick(View v) {
  46.         switch (v.getId()) {
  47.             case R.id.btn_create_qrcode:
  48.                 Toast.makeText(this, "创建了二维码", Toast.LENGTH_SHORT).show();
  49.                 String text = et_input.getText().toString();
  50.                 Log.i(TAG, "text: " + text);
  51.                 imageView.setImageBitmap(QrcodeUtils.createQrcode(text));
  52.                 break;
  53.             case R.id.iv_qrcode:
  54.                 Toast.makeText(this, "点击了二维码", Toast.LENGTH_SHORT).show();
  55.                 View view = getLayoutInflater().inflate(R.layout.dialog_qrcode, null);
  56.                 ImageView imageView = view.findViewById(R.id.iv_qrcode_dialog);
  57.                 imageView.setImageBitmap(QrcodeUtils.createQrcode("WIFI:T:WPA2;S:test;P:12345678;;"));
  58.                 Dialog alertDialog = new AlertDialog.Builder(this).
  59.                         setView(view).
  60.                         create();
  61.                 alertDialog.show();
  62.                 break;
  63.         }
  64.     }
  65. }
复制代码
上面就是一个普通的Activity代码,比较简单易懂。
(2)QrcodeUtils.java

  1. package com.example.qrcode;
  2. import com.google.zxing.BarcodeFormat;
  3. import com.google.zxing.MultiFormatWriter;
  4. import com.google.zxing.common.BitMatrix;
  5. import android.content.Context;
  6. import android.graphics.Bitmap;
  7. import android.graphics.Bitmap.Config;
  8. import android.graphics.Color;
  9. import android.util.Log;
  10. import android.net.wifi.SoftApConfiguration;
  11. import android.net.wifi.WifiManager;
  12. import android.text.TextUtils;
  13. public class QrcodeUtils {
  14.     private static final String TAG = QrcodeUtils.class.getSimpleName();
  15.         //字符串生成Bitmap对象
  16.     public static Bitmap createQrcode(String text) {
  17.         Log.v(TAG, "createQrcode text = " + text);
  18.         if (TextUtils.isEmpty(text)) {
  19.             return null;
  20.         }
  21.         try {
  22.             String contents = new String(text.getBytes("UTF-8"), "ISO-8859-1");
  23.             MultiFormatWriter formatWriter = new MultiFormatWriter();
  24.             BitMatrix bitMatrix = formatWriter.encode(contents, BarcodeFormat.QR_CODE, 800, 800);
  25.             return bitMatrix2Bitmap(bitMatrix);
  26.         } catch (Exception e) {
  27.             e.printStackTrace();
  28.         }
  29.         return null;
  30.     }
  31.     private static Bitmap bitMatrix2Bitmap(BitMatrix matrix) {
  32.         int w = matrix.getWidth();
  33.         int h = matrix.getHeight();
  34.         int[] rawData = new int[w * h];
  35.         for (int i = 0; i < w; i++) {
  36.             for (int j = 0; j < h; j++) {
  37.                 int color = Color.WHITE;
  38.                 if (matrix.get(i, j)) {
  39.                     color = Color.BLACK;
  40.                 }
  41.                 rawData[i + (j * w)] = color;
  42.             }
  43.         }
  44.         Bitmap bitmap = Bitmap.createBitmap(w, h, Config.RGB_565);
  45.         bitmap.setPixels(rawData, 0, w, 0, 0, w, h);
  46.         return bitmap;
  47.     }
  48.     //获取热点二维码规则的字符串
  49.     public static String getHotspotQrcodeString(Context context) {
  50.         WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
  51.         if (wifiManager == null) {
  52.             return null;
  53.         }
  54.         SoftApConfiguration config = wifiManager.getSoftApConfiguration(); //getSoftApConfiguration()方法需要导入framework jar包才能章程编过
  55.         String wifiName = "";
  56.         String wifiPassWord = "";
  57.         wifiName = config.getSsid();
  58.         wifiPassWord = config.getPassphrase();
  59.         int securityType = config.getSecurityType();
  60.         String security = "WPA2";
  61.         //判断是否设置了热点密码,如果未设置热点密码不用设置密码字符串
  62.         if (securityType == SoftApConfiguration.SECURITY_TYPE_OPEN) {
  63.             wifiPassWord = "";
  64.             security = "nopass";
  65.         }
  66.         StringBuilder build = new StringBuilder();
  67.         build.append("WIFI:T:")
  68.                 .append(security)
  69.                 .append(";S:")
  70.                 .append(wifiName)
  71.                 .append(";P:")
  72.                 .append(wifiPassWord)
  73.                 .append(";;");
  74.         return build.toString();
  75.     }
  76. }
复制代码
上面就是一个工具类,主要包罗两个工具方法:
一个是字符串创建二维码Bitmap对象;
一个是获取热点二维码的字符串;
(3)热点二维码

上面的demo代码,默认是普通字符串的二维码生成;
假如要换成本机装备的热点二维码的生成,把字符串生成的方法替换成 getHotspotQrcodeString()方法就行;
但是要留意的是热点信息的获取是要系统签名权限的;
所以要热点字符串生成导入系统签名的jks;
并且需要在AndroidManifest中声明uid:
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:sharedUserId="android.uid.system">
复制代码
另有就是要添加权限:
  1. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
复制代码
另有就是要导入系统的framework 的jar包:
  1. 未导入系统jar包下面的代码会编译错误:
  2. WifiManager.getSoftApConfiguration();
复制代码
4、扩展一下

实在不但仅是手机热点的wifi可以用二维码,普通的wifi也是可以利用二维码;
只要把上面的账号和暗码替换就行;后面就可以提供二维码给别人进行扫描毗连wifi;
所以在现实场景中也可以提宿世成对应的wifi名称和暗码的二维码,保存利用;
特殊是很长的wifi名称或者暗码的情况,利用二维码扫描毗连更加方便。
5、资源下载

项目代码和apk应用代码下载路径:
https://download.csdn.net/download/wenzhi20102321/90640480
apk可以直接下载安装利用;可以定制自己需要的wifi账号和暗码的二维码图片。
三、其他

1、Android 热点二维码简单示例小结

  1. (1)热点二维码固定格式格式:WIFI:T:WifiType;S:WifiName;P:WifiPassword;;
  2. (2)生成二维码图片使用zxing包的相关类
  3. (3)如果应用需要生成设备当时的热点二维码图片,需要系统签名权限命令
复制代码
手机联系人的二维码呢?也是这样的二维码吗?
实在这些码都不一样,像微信个人二维码,挪车码,支付宝的码,
这些二维码都是包罗网址和相干信息的,需要通过具体服务器校验才气跳转到另外界面。
2、之前的二维码和热点先容

Android二维码图片生成和二维码扫描软件的设计
https://blog.csdn.net/wenzhi20102321/article/details/53316179
Android 热点分享二维码功能简单先容
https://blog.csdn.net/wenzhi20102321/article/details/142603112
之前没先容这么具体,并且没有提供到apk和源码。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张春

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表