这些方法仅适用于 android 5.0 及更低版本!
简单的方法:
尝试实例化第WifiConfiguration
一个:
AndroidJavaObject wifiConfiguration = new AndroidJavaClass("android.net.wifi.WifiConfiguration");
现在您可以在此对象中调用方法和设置/获取字段:
// to set SSID
wifiConfiguration.Set("SSID", meSSID); // string
wifiConfiguration.Set("preSharedKey", mePassword); // string
设置所有必填字段后,只需调用您的setWifiApEnabled
方法:
wifiManager.Call<bool>("setWifiApEnabled", wifiConfiguration, enabled);
也许您将不得不设置比这两个更多的字段,但要确认您应该检查源并确保setWifiApEnabled
内部使用什么方法。
艰难的方式:(
使用反射代码)
第 6 步不适用于 android 5.0+ !
使用反射AndroidJavaObject
可能有点棘手,因为您必须记住处置每个对象。
所以从一开始:
// android code for that should look like :
// wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
// but in Unity C# you have to split this into few chunks:
// 1. Get calling class :
using ( AndroidJavaObject classObj = wifiManager.Call<AndroidJavaObject>("getClass") )
{
// classObj should contains your class object
// 2. call get WifiConfiguration class details :
using ( AndroidJavaObject wifiConfiguration = new AndroidJavaObject("setWifiApEnabled") )
{
// 3. Fill that object :
wifiConfiguration.Set("SSID", meSSID); // string
wifiConfiguration.Set("preSharedKey", mePassword); // string
// 4. Get WifiConfiguration class definition
using (AndroidJavaObject wifiCfgClass = wifiConfiguration.Call<AndroidJavaObject>("getClass") )
{
// 5. Get boolean definition
using ( AndroidJavaObject booleanObj = new AndroidJavaObject("java.lang.Boolean") )
{
using ( AndroidJavaObject booleanClass = booleanObj.Call<AndroidJavaObject>("getClass") )
// 6. Get method definition
using ( AndroidJavaObject methodObj = classObj.Call<AndroidJavaObject>("getMethod", "setWifiApEnabled", wifiCfgClass , booleanClass))
{
// 7. Call that method :)
methodObj.Call("invoke", wifiManager, wifiConfiguration, enabled);
}
}
}
}
}
无线配置:
我试图找出为什么上面的代码可能不起作用,但对我来说它工作正常(在一些虚拟机和三星 Galaxy S5 Neo 上测试)。
可能的情况(我几乎在午夜发现)是一个密码短语。
根据关于WPA-PSK部分的这篇维基百科文章
也称为 WPA-PSK(预共享密钥)模式,专为家庭和小型办公网络而设计,不需要身份验证服务器。 [9] 每个无线网络设备都使用 256 位密钥对网络流量进行加密。该密钥可以作为 64 个十六进制数字的字符串输入,也可以作为 8 到 63 个可打印 ASCII 字符的密码短语输入。[10] 如果使用 ASCII 字符,则通过将 PBKDF2 密钥派生函数应用于密码短语,使用 SSID 作为盐和 HMAC-SHA1 的 4096 次迭代来计算 256 位密钥。 [11] WPA-Personal 模式适用于 WPA 和 WPA2。)
我的建议是使用与上面链接的文章中相同的密码来确保它是有效的。
还有一点需要注意的是SSID部分,它在 wikipedia 上有一个简短但很好的描述。
一个常见但不正确的假设是,SSID 是一串人类可读的字符(如 ASCII),以 NUL 字符结尾(如在 C 字符串中)。SSID 必须按原样处理和处理,即 0-32 个八位字节的序列,其中一些可能不是人类可读的
根据我的检查,您不需要在 Java 或 C# 中以空值终止您的字符串,因为它将由本机代码处理,但您仍然不应超过 31 个字符(32 将是空字符)。
我检查了这个:
SSID:MeHotSpot
WPA-PSK:5260305714217573