Android 热点二维码简单示例

news2025/7/18 17:52:06

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和源码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2338734.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVAEE(网络原理—UDP报头结构)

我们本篇文章要讲的是UDP的报头结构以及注意事项。 下面呢&#xff0c;我先说一下UDP是什么&#xff1f; 1.UDP是什么&#xff1f; UDP是一种网络协议。网络协议是计算机网络中&#xff0c;为了使不同设备之间能够准确、高效地进行数据交换和通信&#xff0c;而预先制定的一…

通过docker create与export来分析诊断故障镜像

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

LINUX419 更换仓库(没换成)find命令

NAT模式下虚拟机需与网卡处在同一个网段中吗 和VM1同个网段 会不会影响 这个很重要 是2 改成点2 倒是Ping通了 为啥ping百度 ping到别的地方 4399 倒是ping通了 准备下载httpd包 下不下来 正在替换为新版本仓库 报错 failure: repodata/repomd.xml from local: [Er…

鸿蒙学习笔记(5)-HTTP请求数据

一、Http请求数据 http模块是鸿蒙内置的一个模块&#xff0c;提供了网络请求的能力。不需要再写比较原始的AJAS代码。 ps:在项目中如果要访问网络资源&#xff0c;不管是图片文件还是网络请求&#xff0c;必须给项目开放权限。 &#xff08;1&#xff09;网络连接方式 HTTP数…

Spark-SQL核心编程

Spark-SQL核心编程 数据加载与保存 加载数据 spark.read.load 是加载数据的通用方法。如果读取不同格式的数据&#xff0c;可以对不同的数据格式进行设定 保存数据 df.write.save 是保存数据的通用方法。如果保存不同格式的数据&#xff0c;可以对不同的数据格式进行设定 …

LVGL源码(9):学会控件的使用(自定义弹窗)

LVGL版本&#xff1a;8.3 LVGL的控件各式各样&#xff0c;每种控件都有自己的一些特性&#xff0c;当我们想要使用一个LVGL控件时&#xff0c;我们首先可以通过官网去了解控件的一些基本特性&#xff0c;官网链接如下&#xff1a; LVGL Basics — LVGL documentation&#xf…

8、表单控制:预言水晶球——React 19 复杂表单处理

一、水晶球的预言本质 "每个表单都是时空裂缝中的预言容器&#xff0c;"占卜课教授特里劳妮凝视着水晶球&#xff0c;"React-Hook-Form与Formik的融合&#xff0c;让数据捕获如同捕捉未来碎片&#xff01;" ——以魔法部神秘事务司的预言厅为隐喻&#xf…

8 编程笔记全攻略:Markdown 语法精讲、Typora 编辑器全指南(含安装激活、基础配置、快捷键详解、使用技巧)

1 妙笔在手&#xff0c;编程无忧&#xff01; 1.1 编程为啥要做笔记&#xff1f;这答案绝了&#xff01; 嘿&#xff0c;各位键盘魔法师&#xff01;学编程不记笔记&#xff0c;就像吃火锅不配冰可乐 —— 爽到一半直接噎住&#xff01;你以为自己脑子是顶配 SSD&#xff0c;结…

Linux(autoDL云服务器)mamba-ssm环境安装——一次成功!

1.创建环境选择torch2.0&#xff0c; cuda11.8&#xff0c;python3.8 2.从GitHub官网下载cp38对应的&#xff0c;causl_conv1d&#xff0c;和mamba-ssm2.2.2。下载入下图所示。 3.直接用finalshell 或者xshell连接服务器上传&#xff0c;到根目录下面。 直接用pip install *…

代码审计入门 原生态sql注入篇

前置知识&#xff1a; 漏洞形成的原因&#xff1a; 1、可控的参数 2、函数缺陷 代码审计的步骤&#xff1a; 1、全局使用正则搜索 漏洞函数 &#xff0c;然后根据函数看变量是否可控&#xff0c;再看函数是否有过滤 2、根据web的功能点寻找函数&#xff0c;然后根据函数看…

spring Ai---向量知识库(一)

在一些垂直领域以及公司内部信息相关或者实时性相关的大模型应用&#xff0c;就无法直接使用chatGPT。 这个时候&#xff0c;向量知识库就进入了。 通过坐标向量最接近的即为匹配相关答案。 向量模型定义&#xff1a;将文档向量化&#xff0c;保证内容越相似的文本&#xff0c;…

jmeter利用csv进行参数化和自动断言

1.测试数据 csv测试数据如下&#xff08;以注册接口为例&#xff09; 2.jemer参数化csv设置 打开 jmeter&#xff0c;添加好线程组、HTTP信息头管理器、CSV 数据文件设置、注册请求、响应断言、查看结果树 1&#xff09; CSV 数据文件设置 若 CSV 中数据包含中文&#xff0c;…

数据结构实验7.2:二叉树的基本运算

文章目录 一&#xff0c;实验目的二&#xff0c;问题描述三&#xff0c;基本要求四&#xff0c;实验操作五&#xff0c;示例代码六&#xff0c;运行效果 一&#xff0c;实验目的 深入理解树与二叉树的基本概念&#xff0c;包括节点、度、层次、深度等&#xff0c;清晰区分二叉…

Go-zero框架修改模版进行handler统一响应封装

使用go-zero快速生成接口的时候&#xff0c;发现还是有一些情况不太好处理&#xff0c;比如说&#xff0c;想要自定义响应封装等等。 最开始第一版写api文件的时候&#xff0c;写法是这样的。 type LoginRequest {UserName string json:"userName"Password string …

AI专题(一)----NLP2SQL探索以及解决方案

前面写了很多编码、算法、底层计算机原理等相关的技术专题&#xff0c;由于工作方向调整的缘故&#xff0c;今天开始切入AI人工智能相关介绍。本来按照规划&#xff0c;应该先从大模型的原理开始介绍会比较合适&#xff0c;但是计划赶不上变化&#xff0c;前面通用大模型的工作…

深入理解 React Hooks:简化状态管理与副作用处理

在现代前端开发中&#xff0c;React 已经成为了最受欢迎的 JavaScript 库之一。随着 React 16.8 的发布&#xff0c;React Hooks 的引入彻底改变了开发者编写组件的方式。Hooks 提供了一种更简洁、更直观的方式来管理组件的状态和副作用&#xff0c;使得函数组件能够拥有类组件…

Java 动态代理实现

Java 动态代理实现 一、JDK动态代理二、CGLIB动态代理三、动态代理的应用场景四、JDK代理与CGLIB代理比较 动态代理是Java中一种强大的技术&#xff0c;它允许在运行时创建代理对象&#xff0c;用于拦截对目标对象的方法调用。 一、JDK动态代理 JDK动态代理是Java标准库提供的代…

人脸扫描黑科技:多相机人脸扫描设备,打造你的专属数字分身

随着科技的迅猛发展&#xff0c;人脸扫描这个词已经并不陌生&#xff0c;通过人脸扫描设备制作超写实人脸可以为影视制作打造逼真角色、提升游戏沉浸感&#xff0c;还能助力教育机构等领域生产数字人以丰富教学资源&#xff0c;还在安防、身份识别等领域发挥关键作用&#xff0…

基于Python的中国象棋小游戏的设计与实现

基于Python的中国象棋小游戏的设计与实现 第一章 绪论1.1 研究背景1.2 研究意义 第二章 需求分析2.1 需求分析2.1.1核心功能需求2.1.2 用户体验需求2.1.3 衍生功能需求 2.2 可行性分析2.2.1 技术可行性2.2.2 经济可行性2.2.3 市场可行性2.2.4 法律与合规性 第三章 概要设计3.1 …

简单好用的在线工具

用AI写了一些在线工具&#xff0c;简介好用&#xff0c;推荐给大家&#xff0c;欢迎大家使用并提议意见。 网址&#xff1a;https://www.bittygarden.com/ 目前已有以下功能&#xff1a; MD5SM3SHAUnicode 编码Unicode 解码Base32 编码Base32 解码Base64 编码Base64 解码URL …