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