小编简单介绍如何经过调用android API来获取wifi服务(
很是感谢做者安晓辉发布了qt android 核心编程这本书,让我两天搞懂了不少在qt中开发安卓的要领,如今跟你们分享下!至于还没知道
怎么配置qt android换将的开发者,极力推荐先去看看qt android 核心编程这本书(哈哈,一知道要出这本书, 还没出版的时候我每天看着京东
有货了没!)
上代码!
工程源码(这些都是大二大三时候造的,代码可能有点烂)
ExtendsQtWithJava.javajava
package an.qt.extendsQtWithJava; import android.app.PendingIntent; import android.widget.Toast; import android.os.Handler; import android.os.Message; import android.util.Log; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.location.LocationManager; import android.location.Criteria; import android.provider.Settings; import android.location.Location; import android.location.LocationListener; import android.location.LocationProvider; import java.lang.ClassLoader; import dalvik.system.DexClassLoader; import java.lang.reflect.Field; import android.os.Bundle; import android.os.Environment; import java.io.File; //tommego import java.util.List; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.net.wifi.WifiManager.WifiLock; import java.io.IOException; import java.lang.Exception; import java.lang.Throwable; import android.net.DhcpInfo; import android.content.Context; //屏幕像素密度 import android.util.DisplayMetrics; //tommego public class ExtendsQtWithJava extends org.qtproject.qt5.android.bindings.QtActivity { private static ExtendsQtWithJava m_instance; /***************************tommego*********************************************************************************/ /***************************tommego*********************************************************************************/ public static WifiInfo currentWifiInfo;//当前所链接的wifi public static List<ScanResult> wifiList;// wifi列表 public static List<WifiConfiguration> wifiConList;// wifi 已成功链接过的配置列表 public static int wifiIndex;//从scanResult 获得的wifi列表进行记录位置 public static String[] str;//。。。。。 //手机链接wifi 后获得的动态ip public static DhcpInfo hostDhcpInfo; /***************************tommego*********************************************************************************/ /***************************tommego*********************************************************************************/ public ExtendsQtWithJava(){ m_instance = this; } //实例化单例对象 /***************************tommego*********************************************************************************/ /***************************tommego*********************************************************************************/ //open wifi public static void openWifi(){ WifiManager conMan = (WifiManager) m_instance.getSystemService(Context.WIFI_SERVICE); if(!conMan.isWifiEnabled()){ conMan.setWifiEnabled(true); } } //close wifi public static void closeWifi(){ WifiManager conMan = (WifiManager) m_instance.getSystemService(Context.WIFI_SERVICE); if(conMan.isWifiEnabled()){ conMan.setWifiEnabled(false); } } //scan wifi public static void scanWifi(){ WifiManager conMan = (WifiManager) m_instance.getSystemService(Context.WIFI_SERVICE); conMan.startScan(); // 获取扫描结果 wifiList = conMan.getScanResults(); } //get wifi info public static int getWifiCount(){ return wifiList.size(); } public static String getWifiSSID(int index){ if(index>=0&&index<wifiList.size()){ return wifiList.get(index).SSID; } else{ return ""; } } public static int getWifiLevel(int index){ if(index>=0&&index<wifiList.size()){ return wifiList.get(index).level; } else{ return 0; } } public static int getWifiFrequency(int index){ if(index>=0&&index<wifiList.size()){ return wifiList.get(index).frequency; } else{ return 0; } } public static String getWifiBSSID(int index){ if(index>=0&&index<wifiList.size()){ return wifiList.get(index).BSSID; } else{ return ""; } } //加密方式判断 public static String getWifiKeyType(int index){ if (wifiList.get(index).capabilities.contains("WEP")) { return "WEP"; } else if (wifiList.get(index).capabilities.contains("PSK")) { return "PSK"; } else if (wifiList.get(index).capabilities.contains("EAP")) { return "EAP"; } return "无"; } //get current connected wifi info public static String getCurrentWifiSSID(){ WifiManager conMan = (WifiManager) m_instance.getSystemService(Context.WIFI_SERVICE); currentWifiInfo = conMan.getConnectionInfo(); return currentWifiInfo.getSSID(); } //get current ip address public static String getCurrentWifiIPAddress(){ WifiManager conMan = (WifiManager) m_instance.getSystemService(Context.WIFI_SERVICE); currentWifiInfo = conMan.getConnectionInfo(); return WifiUtil.intToIp(currentWifiInfo.getIpAddress()); } //仍是路由派来的IP,啊啊啊啊(…*……*…) public static String getHostIPAddress(){ WifiManager conMan = (WifiManager) m_instance.getSystemService(Context.WIFI_SERVICE); hostDhcpInfo = conMan.getDhcpInfo(); return WifiUtil.intToIp(hostDhcpInfo.serverAddress); } //get current network id public static int getCurrentNetworkId(){ WifiManager conMan = (WifiManager) m_instance.getSystemService(Context.WIFI_SERVICE); currentWifiInfo = conMan.getConnectionInfo(); return currentWifiInfo.getNetworkId(); } //get current connected wifi info //get wifi connect state public static int networkState(){ WifiManager conMan = (WifiManager) m_instance.getSystemService(Context.WIFI_SERVICE); return conMan.isWifiEnabled()? 1 : 0; } //链接到新设备 public static void connectDevice(String ssid,String passwd){ // WifiConfiguration wc = new WifiConfiguration(); // wc.SSID = "\""+ssid+"\""; // wc.preSharedKey = "\""+passwd+"\""; // wc.hiddenSSID = true; // wc.status = WifiConfiguration.Status.ENABLED; // wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); // wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); // wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); // wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); // wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); // wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); // wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); } //生成一个网络配置 public WifiConfiguration CreateWifiInfo(ScanResult scanresult,String Password) { WifiConfiguration wc = new WifiConfiguration(); wc.SSID = "\""+scanresult.SSID+"\""; //<span style="color: rgb(255, 0, 0); ">这个地方必定要注意了。旁边的“是不可以省略的。密码的地方也同样。</span> wc.preSharedKey = "\""+Password+"\""; //该热点的密码 wc.hiddenSSID = true; wc.status = WifiConfiguration.Status.ENABLED; wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); return wc; } //无密码 public WifiConfiguration CreateWifiInfoWithoutPasswd(ScanResult scanresult) { WifiConfiguration wc = new WifiConfiguration(); wc.SSID = "\""+scanresult.SSID+"\""; //<span style="color: rgb(255, 0, 0); ">这个地方必定要注意了。旁边的“是不可以省略的。密码的地方也同样。</span> // wc.preSharedKey = "\""+Password+"\""; //该热点的密码 wc.hiddenSSID = true; wc.status = WifiConfiguration.Status.ENABLED; wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); return wc; } //根据网络配置链接wifi public static int connectToWifi(int scanresultId,String Password){ WifiManager conMan = (WifiManager) m_instance.getSystemService(Context.WIFI_SERVICE); int networkId = conMan.addNetwork(m_instance.CreateWifiInfo(wifiList.get(scanresultId),Password)); if(networkId != -1){ conMan.enableNetwork(networkId, false); conMan.saveConfiguration(); return 1;//success } return 0;//falure } //无密码 public static int connectToWifiWithoutPasswd(int scanresultId){ WifiManager conMan = (WifiManager) m_instance.getSystemService(Context.WIFI_SERVICE); int networkId = conMan.addNetwork(m_instance.CreateWifiInfoWithoutPasswd(wifiList.get(scanresultId))); if(networkId != -1){ conMan.enableNetwork(networkId, false); conMan.saveConfiguration(); return 1;//success } return 0;//falure } //获取屏幕像素密度 public static double getDentisy(){ DisplayMetrics metrics=new DisplayMetrics(); m_instance.getWindowManager().getDefaultDisplay().getMetrics(metrics); return metrics.density; } /***************************tommego*********************************************************************************/ /***************************tommego*********************************************************************************/ }
WifiUtil.java //一个将IP二进制转换咱们能理解的地址的类android
package an.qt.extendsQtWithJava; import java.util.List; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; public class WifiUtil { public static WifiConfiguration createWifiInfo(String SSID, String Password, int Type, WifiManager wifiManager) { WifiConfiguration config = new WifiConfiguration(); config.allowedAuthAlgorithms.clear(); config.allowedGroupCiphers.clear(); config.allowedKeyManagement.clear(); config.allowedPairwiseCiphers.clear(); config.allowedProtocols.clear(); config.SSID = "\"" + SSID + "\""; WifiConfiguration tempConfig = isExsits(SSID, wifiManager); if (tempConfig != null) { wifiManager.removeNetwork(tempConfig.networkId); } if (Type == 1) // WIFICIPHER_NOPASS { config.wepKeys[0] = ""; config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.wepTxKeyIndex = 0; } if (Type == 2) // WIFICIPHER_WEP { config.hiddenSSID = true; config.wepKeys[0] = "\"" + Password + "\""; config.allowedAuthAlgorithms .set(WifiConfiguration.AuthAlgorithm.SHARED); 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 (Type == 3) // WIFICIPHER_WPA { config.preSharedKey = "\"" + Password + "\""; config.hiddenSSID = true; config.allowedAuthAlgorithms .set(WifiConfiguration.AuthAlgorithm.OPEN); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); config.allowedPairwiseCiphers .set(WifiConfiguration.PairwiseCipher.TKIP); // config.allowedProtocols.set(WifiConfiguration.Protocol.WPA); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedPairwiseCiphers .set(WifiConfiguration.PairwiseCipher.CCMP); config.status = WifiConfiguration.Status.ENABLED; } return config; } //判断wifi是否存在 private static WifiConfiguration isExsits(String SSID, WifiManager wifiManager) { List<WifiConfiguration> existingConfigs = wifiManager .getConfiguredNetworks(); for (WifiConfiguration existingConfig : existingConfigs) { if (existingConfig.SSID.equals("\"" + SSID + "\"")) { return existingConfig; } } return null; } //转换IP地址 public static String intToIp(int i) { return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF) + "." + ((i >> 24) & 0xFF); } }
这个是java端实现操做wifi的类,接下来是c++经过jni调用java接口的实现
wifimanager.hc++
#ifndef WIFIMANAGER_H #define WIFIMANAGER_H #include <QObject> #include <QAndroidJniObject> #include <QList> #include <QString> struct WifiInfo{ int level; QString SSID; QString BSSID; QString keytype; }; class WifiManager : public QObject { Q_OBJECT public: explicit WifiManager(QObject *parent = 0); ~WifiManager(); //wifi process Q_INVOKABLE bool isWifiEnable(); Q_INVOKABLE void openWifi(); Q_INVOKABLE void closeWifi(); Q_INVOKABLE void scanWifi(); Q_INVOKABLE int getWifiListCount(); Q_INVOKABLE QString getWifiSSID(int index); Q_INVOKABLE QString getWifiBSSID(int index); Q_INVOKABLE int getWifiLevel(int index); Q_INVOKABLE QString getKeyType(int index); //获取当前链接的wifi信息 Q_INVOKABLE QString getConntectedWifiSSID(); Q_INVOKABLE QString getConnectedWifiAddress(); //链接到wifi Q_INVOKABLE void connectToWifi(int id,QString passwd); Q_INVOKABLE void connectToWifiWithoutPasswd(int id); //多媒体音量控制 Q_INVOKABLE int getMaxVolumnStream(); Q_INVOKABLE int getCurrentVolumnStream(); Q_INVOKABLE void setVolumnStream(int a); //获取屏幕像素密度 Q_INVOKABLE double getDentisy(); //user process Q_INVOKABLE void refreshWifiList(); Q_INVOKABLE int wifiCount(); Q_INVOKABLE int wifiLevel(int i); Q_INVOKABLE QString wifiSSID(int i); Q_INVOKABLE QString wifiBSSID(int i); Q_INVOKABLE QString wifiKeyType(int i); signals: public slots: private: QList<WifiInfo> wifiList; }; #endif // WIFIMANAGER_H
wifimanager.cppgit
#include "wifimanager.h" #include <QDebug> #include <math.h> #include "jni.h" WifiManager::WifiManager(QObject *parent) : QObject(parent) { } WifiManager::~WifiManager() { } /***********************************wifi cability ********************/ bool WifiManager::isWifiEnable(){ jint state =QAndroidJniObject::callStaticMethod<jint>("an/qt/extendsQtWithJava/ExtendsQtWithJava", "networkState"); return state==1?true:false; } void WifiManager::openWifi(){ QAndroidJniObject::callStaticMethod<void>("an/qt/extendsQtWithJava/ExtendsQtWithJava", "openWifi"); } void WifiManager::closeWifi(){ QAndroidJniObject::callStaticMethod<void>("an/qt/extendsQtWithJava/ExtendsQtWithJava", "closeWifi"); } void WifiManager::scanWifi(){ QAndroidJniObject::callStaticMethod<void>("an/qt/extendsQtWithJava/ExtendsQtWithJava", "scanWifi"); } int WifiManager::getWifiListCount(){ jint count=QAndroidJniObject::callStaticMethod<jint>("an/qt/extendsQtWithJava/ExtendsQtWithJava", "getWifiCount"); return count; } QString WifiManager::getWifiSSID(int index){ QAndroidJniObject str=QAndroidJniObject::callStaticObjectMethod("an/qt/extendsQtWithJava/ExtendsQtWithJava", "getWifiSSID", "(I)Ljava/lang/String;",index); return str.toString(); } QString WifiManager::getWifiBSSID(int index){ QAndroidJniObject str=QAndroidJniObject::callStaticObjectMethod("an/qt/extendsQtWithJava/ExtendsQtWithJava", "getWifiBSSID", "(I)Ljava/lang/String;",index); return str.toString(); } int WifiManager::getWifiLevel(int index){ int a= QAndroidJniObject::callStaticMethod<int>("an/qt/extendsQtWithJava/ExtendsQtWithJava", "getWifiLevel","(I)I",index); qDebug()<<"wifi level: "<<a; if(abs(a)>80){ return 1; } else if(abs(a)>50&&abs(a)<=80){ return 2; } else if(abs(a)<=50){ return 3; } } QString WifiManager::getKeyType(int index){ QAndroidJniObject str=QAndroidJniObject::callStaticObjectMethod("an/qt/extendsQtWithJava/ExtendsQtWithJava", "getWifiKeyType", "(I)Ljava/lang/String;",index); return str.toString(); } //获取当前链接的wifi信息 QString WifiManager::getConntectedWifiSSID(){ QAndroidJniObject str=QAndroidJniObject::callStaticObjectMethod("an/qt/extendsQtWithJava/ExtendsQtWithJava", "getCurrentWifiSSID", "()Ljava/lang/String;"); return str.toString(); } QString WifiManager::getConnectedWifiAddress(){ QAndroidJniObject str=QAndroidJniObject::callStaticObjectMethod("an/qt/extendsQtWithJava/ExtendsQtWithJava", "getHostIPAddress", "()Ljava/lang/String;"); return str.toString(); } //链接到wifi void WifiManager::connectToWifi(int id,QString passwd){ QAndroidJniObject str=QAndroidJniObject::fromString(passwd); jint a=QAndroidJniObject::callStaticMethod<jint>("an/qt/extendsQtWithJava/ExtendsQtWithJava", "connectToWifi", "(ILjava/lang/String;)I",id,str.object<jstring>()); qDebug()<<"connect to wifi :"<<a; } void WifiManager::connectToWifiWithoutPasswd(int id){ jint a=QAndroidJniObject::callStaticMethod<jint>("an/qt/extendsQtWithJava/ExtendsQtWithJava", "connectToWifiWithoutPasswd", "(I)I",id); qDebug()<<"connect to wifi :"<<a; } /***********************************wifi cability ********************/ /***********************************多媒体音量控制********************/ int WifiManager::getMaxVolumnStream(){ return QAndroidJniObject::callStaticMethod<int>("an/qt/extendsQtWithJava/ExtendsQtWithJava", "getMaxVolumnStream","()I"); } int WifiManager::getCurrentVolumnStream(){ return QAndroidJniObject::callStaticMethod<int>("an/qt/extendsQtWithJava/ExtendsQtWithJava", "getCurrentVolumnStream","()I"); } void WifiManager::setVolumnStream(int a){ QAndroidJniObject::callStaticMethod<void>("an/qt/extendsQtWithJava/ExtendsQtWithJava", "setVolumnStream","(I)V",a); } /***********************************多媒体音量控制********************/ //获取屏幕像素密度 double WifiManager::getDentisy(){ return QAndroidJniObject::callStaticMethod<double>("an/qt/extendsQtWithJava/ExtendsQtWithJava", "getDentisy","()D"); } /***********************************user functionds*************************/ void WifiManager::refreshWifiList(){ wifiList.clear(); scanWifi(); int count=getWifiListCount(); for(int a=0;a<count;a++){ WifiInfo info; info.SSID=getWifiSSID(a); info.BSSID=getWifiBSSID(a); info.level=getWifiLevel(a); info.keytype=getKeyType(a); wifiList.append(info); } } int WifiManager::wifiCount(){ return wifiList.count(); } int WifiManager::wifiLevel(int i){ return wifiList.at(i).level; } QString WifiManager::wifiSSID(int i){ return wifiList.at(i).SSID; } QString WifiManager::wifiBSSID(int i){ return wifiList.at(i).BSSID; } QString WifiManager::wifiKeyType(int i){ return wifiList.at(i).keytype; } /***********************************user functionds*************************/
效果截图:编程