QT_QML WiFi连接(2/2)(Android篇)

一、大概环境介绍

QT版本:5.12.1
编译器:Android for armeabi-v7a (clang QT5.12.1 for Android ARMv7)
系统:Android 10.0

功能:扫描、连接(已配置直接连接,未配置输入密码连接,无密码WiFi连接),忘记WiFi等
ps.
并不了解java代码,只是有安卓操作WiFi的需求,故收集资料整理而成,

二、实现功能&代码

1、注意事项

(1)注意文件编码格式,修改之后会保存为QT的默认格式,如果设置的默认格式不是utf-8需要手动修改为utf-8。

(2)为了能够调用非静态方法,因为类没有创建时,是无法调用非静态方法的。因为需要对AndroidManifest.xml进行修改,把android:name改为包名,然后该包的方法继承主Activity的类,使得项目已启动就能创建类,这样我们就能调用非静态方法。

2、代码

(1)准备

    public static ExtendsQtWithJava m_instance;
    //初始化
    public ExtendsQtWithJava()
    {
        m_instance = this;
    }
    //开启wifi
    public static void enableWifi()
    {
        WifiManager wifiManager = (WifiManager)m_instance. getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        if (wifiManager != null && !wifiManager.isWifiEnabled())
        {
           wifiManager.setWifiEnabled(true);
        }
    }

(2)扫描Wifi

A:java代码:
    public static String scanWifiResult()
    {
        WifiManager wifiManager = (WifiManager)m_instance. getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        wifiManager.startScan();
        List<ScanResult> scanResultList = wifiManager.getScanResults();
        String wifiInfoList = "";
        if(scanResultList != null)
        {
            for(int i=0;i<scanResultList.size();i++)
            {
                ScanResult tempScanResult = scanResultList.get(i);
                if(tempScanResult != null)
                {
                    int wifiLevel = WifiManager.calculateSignalLevel(tempScanResult.level,4);
                    wifiInfoList += tempScanResult.SSID+"*_*"+wifiLevel+"*_*"+tempScanResult.capabilities+"-_-";
                }
            }
        }
        return wifiInfoList;
    }
B:QT jni调用:
QStringList CWifiInfoManage::getWifiInfoList()
{
	QAndroidJniObject str = QAndroidJniObject::callStaticObjectMethod("an/qt/extendsQtWithJava/ExtendsQtWithJava","scanWifiResult", "()Ljava/lang/String;");
    QString sWifiInfo = str.toString();
    return sWifiInfo.split("-_-");
}

(3)获取当前连接wifi信息

A:java代码:
    public static String getConnectWifiInfo()
    {
        String connectWifiInfo = "";
        WifiManager wifiManager = (WifiManager)m_instance. getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        if (wifiInfo.getSSID().contains("\""))
        {
            int wifiLevel = WifiManager.calculateSignalLevel(wifiInfo.getRssi(),4);
            connectWifiInfo = wifiInfo.getSSID()+"*_*"+wifiLevel;
        }
        return connectWifiInfo;
    }
B:QT jni调用:
QStringList CWifiInfoManage::getConnectWifiInfo()
{
    QAndroidJniObject str = QAndroidJniObject::callStaticObjectMethod("an/qt/extendsQtWithJava/ExtendsQtWithJava","getConnectWifiInfo", "()Ljava/lang/String;");
    QString wifiInfo = str.toString();
    if(wifiInfo!="")
    {
        return wifiInfo.split("*_*");
    }
}

(4)获取已配置过wifi列表

获取设备的WiFi信息并保存,用于已经配置过的信息可以不输入密码直接连接。另保存加密方式用于界面显示等。

A:java代码:
    public static String getHistoryWifiList()
    {
        String historyWifiList = "";
        WifiManager wifiManager = (WifiManager)m_instance. getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        List<WifiConfiguration> wifiConfiguration = wifiManager.getConfiguredNetworks();
        for(int i=0;i<wifiConfiguration.size();i++)
        {
            historyWifiList += wifiConfiguration.get(i).SSID+"*_*"+wifiConfiguration.get(i).networkId+"-_-";
        }
        return historyWifiList;
    }
B:QT jni调用:
void CWifiInfoManage::getHistoryWifiList()
{
    QAndroidJniObject str = QAndroidJniObject::callStaticObjectMethod("an/qt/extendsQtWithJava/ExtendsQtWithJava",
                                                                      "getHistoryWifiList",
                                                                      "()Ljava/lang/String;");
    QString wifiInfo = str.toString();
    if(wifiInfo!="")
    {
        QStringList wiifInfoList = wifiInfo.split("-_-");
        for (int i=0;i<wiifInfoList.length();i++)
        {
            return wiifInfoList[i].split("*_*");
        }
    }
}

(5)连接到指定wifi

A:java代码:

最初是将wifi信息函数参数,但是在QT中通过jni调用时一直出错,所以改为用四个函数分别设置来连接信息,在调用连接函数。😢😢😢(如果有大手子调成功了可以挂出来观摩观摩)😢😢😢
这里先设置wifi信息,在调用连接

    static String ssid = "";
    static String password = "";
    static int keyType = 0;
    static int index = 0;
    public static void setSsid(String str)
    {
        ssid = str;
    }
    public static void setPassword(String str)
    {
        password = str;
    }
    public static void setKeyType(int str)
    {
        keyType = str;
    }
    public static void setIndex(int str)
    {
        index = str;
    }
    public static String connectWifi()
    {
//        System.out.println("ssid="+ssid);
//        System.out.println("password="+password);
//        System.out.println("keyType="+keyType);
//        System.out.println("index="+index);
        String connectState = "0";
        WifiManager wifiManager = (WifiManager)m_instance. getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiinfo = wifiManager.getConnectionInfo();//获取当前连接wifi
        if (null != wifiinfo)
        {
            wifiManager.disableNetwork(wifiinfo.getNetworkId());//断开当前连接wifi
        }
        if(index>0)//已经配置过的wifi
        {
            if(wifiManager.enableNetwork(index, true))
            {
                connectState = "1";
            }
            else
            {
                connectState = "0";
            }
        }
        else
        {
            WifiConfiguration config = new WifiConfiguration();
            config.allowedAuthAlgorithms.clear();
            config.allowedGroupCiphers.clear();
            config.allowedKeyManagement.clear();
            config.allowedPairwiseCiphers.clear();
            config.allowedProtocols.clear();
            config.SSID = "\"" + ssid + "\"";
            if(keyType == 0)
            {
                config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
            }
            if(keyType == 1)
            {
                config.preSharedKey = "\"" + password + "\"";
                config.hiddenSSID = true;
                config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
                config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
                config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
                config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
                config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
                config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
                config.wepTxKeyIndex = 0;
            }
            if(keyType == 2)
            {
                config.preSharedKey = "\"" + password + "\"";
                config.hiddenSSID = true;
                config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
                config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
                config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
                config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
                config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
                config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
                config.status = WifiConfiguration.Status.ENABLED;
            }
            int i = wifiManager.addNetwork(config);
            if(i>0)
            {
                wifiManager.saveConfiguration();
                if(wifiManager.enableNetwork(i, true))
                {
                    connectState = "1";
                }
                else
                {
                    connectState = "0";
                }
            }
        }
        return connectState;
    }
B:QT jni调用:
bool CWifiInfoManage::connectWifi(QString wifiName, QString passWord, int keyType, int index)
{
    QAndroidJniObject objName = QAndroidJniObject::fromString(wifiName);
    jstring jName = objName.object<jstring>();
    QAndroidJniObject objPass = QAndroidJniObject::fromString(passWord);
    jstring jPass = objPass.object<jstring>();
    QAndroidJniObject m_activity = QtAndroid::androidActivity();
    m_activity.callStaticMethod<void>("an/qt/extendsQtWithJava/ExtendsQtWithJava",
                                      "setSsid",
                                      "(Ljava/lang/String;)V",
                                      jName);
    m_activity.callStaticMethod<void>("an/qt/extendsQtWithJava/ExtendsQtWithJava",
                                      "setPassword",
                                      "(Ljava/lang/String;)V",
                                      jPass);
    m_activity.callStaticMethod<void>("an/qt/extendsQtWithJava/ExtendsQtWithJava",
                                      "setKeyType",
                                      "(I)V",
                                      keyType);
    m_activity.callStaticMethod<void>("an/qt/extendsQtWithJava/ExtendsQtWithJava",
                                      "setIndex",
                                      "(I)V",
                                      index);
    QAndroidJniObject boolean = QAndroidJniObject::callStaticObjectMethod("an/qt/extendsQtWithJava/ExtendsQtWithJava",
                                                                          "connectWifi",
                                                                          "()Ljava/lang/String;");
    //延时一段时间
    if(boolean.toString() == "1")
    {
    	//判断连接状态
    	//可以设置连接三次,不成功就删除当前配置等~~~
    }                                                                          
}

(6)删除指定wifi

用于设备已经连接过的wifi始终连不上的场合,可以删除当前的WiFi配置,重新输入密码连接

A:java代码:
    public static String removeWifiInfo()
    {
        WifiManager wifiManager = (WifiManager)m_instance. getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        if(wifiManager.removeNetwork(index))
        {
            return "1";
        }
        else
        {
            return "0";
        }
    }
B:QT jni调用:
void CWifiInfoManage::removeWifiInfo(QString wifiName)
{
    QAndroidJniObject str = QAndroidJniObject::callStaticObjectMethod("an/qt/extendsQtWithJava/ExtendsQtWithJava","removeWifiInfo", "()Ljava/lang/String;");
}

三、其他功能

1、禁用返回键(java代码)

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //app开启时保证屏幕常亮
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            return false;
        }else {
            return super.onKeyDown(keyCode, event);
        }
    }

2、全屏,不显示状态类和导航键

这里不太记得了~,如果不行就看看后面的参考资料吧😂
XML文件添加:

android:theme = "@android:style/Theme.Light.NoTitleBar.Fullscreen"

java代码添加:

    private final static String TAG = "QtFullscreen";
    @Override
    public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
                | View.SYSTEM_UI_FLAG_FULLSCREEN      // hide status bar
                | View.SYSTEM_UI_FLAG_IMMERSIVE);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
                | View.SYSTEM_UI_FLAG_FULLSCREEN      // hide status bar
                | View.SYSTEM_UI_FLAG_IMMERSIVE);
        return super.dispatchTouchEvent(ev);
    }

四、参考资料

找了许多资料,网页一关就再也找不到了~~~链接没办法都挂出来😒😒😒
Qt使用jni调用java代码
不显示状态栏和导航键

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值