admin管理员组文章数量:1565292
目录
- 一、大概环境介绍
- 二、实现功能&代码
- 1、注意事项
- (1)注意文件编码格式,修改之后会保存为QT的默认格式,如果设置的默认格式不是utf-8需要手动修改为utf-8。
- (2)为了能够调用非静态方法,因为类没有创建时,是无法调用非静态方法的。因为需要对AndroidManifest.xml进行修改,把android:name改为包名,然后该包的方法继承主Activity的类,使得项目已启动就能创建类,这样我们就能调用非静态方法。
- 2、代码
- (1)准备
- (2)扫描Wifi
- A:java代码:
- B:QT jni调用:
- (3)获取当前连接wifi信息
- A:java代码:
- B:QT jni调用:
- (4)获取已配置过wifi列表
- A:java代码:
- B:QT jni调用:
- (5)连接到指定wifi
- A:java代码:
- B:QT jni调用:
- (6)删除指定wifi
- A:java代码:
- B:QT jni调用:
- 三、其他功能
- 1、禁用返回键(java代码)
- 2、全屏,不显示状态类和导航键
- 四、参考资料
一、大概环境介绍
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代码
不显示状态栏和导航键
版权声明:本文标题:QT_QML WiFi连接(22)(Android篇) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1727523573a1119036.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论