Qt for Android获取wifi信息

简介


在开发Qt for Android应用程序时,往往会需要用到获取Wifi相关信息的需求,比如要获取wifi名称、wifi信号强度等.针对该需求,本文以一个简单的Demo介绍如何通过调用android接口获取相关信息

获取方法


经过本人查阅相关资料,普遍介绍的方法有三种:
1> 通过QProcess以指令的方式进行获取, 如"netsh wlan show interfaces"指令(不推荐),有兴趣自行研究,可参考博客:https://zhuanlan.zhihu.com/p/520167870?utm_id=0
2> 调用Windows Api,这种不能到移动端,不推荐,自行研究,可参考博客:https://www.jianshu.com/p/fc15107cb92f
3> 通过android原生WifiManager获取,重点介绍这种方式.

获取步骤


1> 创建Qt Widget工程
在这里插入图片描述
这里创建工程的时候需要注意的是编译器要选择android的编译器
在这里插入图片描述
ps : 程序能正常运行的前提是Qt for android开发环境已正确配置好了,如果环境没有配置好(包括android sdk, ndk之类的), 自行百度配置好环境

2> 创建AndroidManifest.xml
qt creator提供了快捷的创建该文件的方法,如图所示,点击项目左侧边栏项目按钮,然后点击创建模板即可
在这里插入图片描述

3> 将AndroidManifest.xml添加到工程
在项目上右键,选择添加现有文件
在这里插入图片描述
添加完成后完整目录结构应当如图所示
在这里插入图片描述

4> 添加java接口文件
在android目录添加上MyWifi.java文件,使目录结构如图所示
在这里插入图片描述

5> 编写java代码

package com.MyWifi;
import org.qtproject.qt.android.bindings.QtActivity;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import java.util.List;
import android.os.Message;
import android.os.Handler;
import android.os.Bundle;
import android.net.wifi.WifiInfo;
public class MyWifi extends org.qtproject.qt.android.bindings.QtActivity
{
    private static MyWifi m_instance;
    private WifiManager wifiManager;
    List<ScanResult> listb;
    public MyWifi() {
        m_instance = this;
    }
    public String[] callExternalCamera()
    {
        System.out.println("I an In");
        wifiManager = (WifiManager)getSystemService(WIFI_SERVICE);
        if(!wifiManager.isWifiEnabled()){
            if(wifiManager.getWifiState() != WifiManager.WIFI_STATE_ENABLING) {
                wifiManager.setWifiEnabled(true);
            }
        }

        WifiInfo wifiInfo = wifiManager.getConnectionInfo();

        // 获取当前连接的wifi的信息
        StringBuffer sb = new StringBuffer();
        sb.append("SSID: ");
        sb.append(wifiInfo.getSSID());
        System.out.println(sb);

        // 获取wifi列表信息
        listb = wifiManager.getScanResults();
        String[] listk = new String[listb.size()];
        String res = " %";
        if(listb!=null){
            for( int i=0;i<listb.size();i++){
                ScanResult scanResult = listb.get(i);
                listk[i] = scanResult.SSID;
                System.out.println(scanResult.SSID);
                res += scanResult.SSID + "%";
                System.out.println(scanResult.level);
            }
            return listk;
        }

        return listk;
    }
}

这里需要注意包名和类名需要和android/src目录下文件目录和文件名对应.

6> 编写c++调用代码

#include <QJniObject>
#include <QJniEnvironment>
#include <QDebug>

void Dialog::getScanResult()
{
#ifdef Q_OS_ANDROID
    QJniEnvironment env;

    QJniObject activity = QNativeInterface::QAndroidApplication::context();
    QJniObject str = activity.callObjectMethod("callExternalCamera", "()[Ljava/lang/String;");
    jobjectArray objectArray = str.object<jobjectArray>();

    const int n = env->GetArrayLength(objectArray);
    for (int i = 0; i < n; ++i) {
        QJniObject element = env->GetObjectArrayElement(objectArray, i);
    }

    if(env->ExceptionCheck()){
        env->ExceptionDescribe();
        env->ExceptionClear();
    }
#endif
}

这里需要注意的是以上代码是Qt6的写法,Qt5对应的QJniObject、QJniEnvironment、QAndroidApplication不叫这个名字;Qt5代码可以参考:
https://blog.csdn.net/weixin_30617561/article/details/96271573

7> 修改AndroidManifest.xml

<?xml version="1.0"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.qtproject.example" android:installLocation="auto" android:versionCode="-- %%INSERT_VERSION_CODE%% --" android:versionName="-- %%INSERT_VERSION_NAME%% --">
    <!-- %%INSERT_PERMISSIONS -->
    <!-- %%INSERT_FEATURES -->
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true"/>
    <application android:name="org.qtproject.qt.android.bindings.QtApplication" android:hardwareAccelerated="true" android:label="-- %%INSERT_APP_NAME%% --" android:requestLegacyExternalStorage="true" android:allowNativeHeapPointerTagging="false" android:allowBackup="true" android:fullBackupOnly="false">
        <activity android:name="com.MyWifi.MyWifi" android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" android:label="-- %%INSERT_APP_NAME%% --" android:launchMode="singleTop" android:screenOrientation="unspecified" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <meta-data android:name="android.app.lib_name" android:value="-- %%INSERT_APP_LIB_NAME%% --"/>
            <meta-data android:name="android.app.arguments" android:value="-- %%INSERT_APP_ARGUMENTS%% --"/>
            <meta-data android:name="android.app.extract_android_style" android:value="minimal"/>
        </activity>
    </application>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"/>
    <uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
</manifest>

需要注意的是权限的添加,需要以下四个权限:
在这里插入图片描述

运行即可得到wifi信息!

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperYang_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值