小编简单介绍如何通过调用android API来获取wifi服务(
非常感谢作者安晓辉发布了qt android 核心编程这本书,让我两天搞懂了很多在qt中开发安卓的要领,现在跟大家分享下!至于还没知道
怎么配置qt android换将的开发者,极力推荐先去看看qt android 核心编程这本书(哈哈,一知道要出这本书, 还没出版的时候我天天看着京东
有货了没!)
上代码!
工程源码(这些都是大二大三时候造的,代码可能有点烂)
ExtendsQtWithJava.java
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二进制转换我们能理解的地址的类
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.h
#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.cpp
#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*************************/
效果截图: