C# 以编程方式打开/关闭WiFi热点

C# 以编程方式打开/关闭WiFi热点,c#,android,unity3d,hotspot,C#,Android,Unity3d,Hotspot,我需要帮助创建一个C#脚本,将android WiFi设置为热点模式。下面是我设法创建的代码 public bool setAPEnabled(bool enabled) { using (AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity")) {

我需要帮助创建一个C#脚本,将android WiFi设置为热点模式。下面是我设法创建的代码

    public bool setAPEnabled(bool enabled)
{
    using (AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity"))
    {
        try
        {
            if(isWifiEnabled()==true){
                setWifiEnabled(false);
            }
            using (var wifiManager = activity.Call<AndroidJavaObject>("getSystemService", "wifi"))
            {
                return wifiManager.Call<bool>("setWifiApEnabled",null, enabled);
            }
        }
        catch (Exception e)
        {
        }
    }
    return false;
}
public bool setAPEnabled(bool启用)
{

使用(AndroidJavaObject activity=new AndroidJavaClass(“com.unity3d.player.UnityPlayer”).GetStatic我知道我必须用settings对象替换我的null值,但我完全不知道如何在Unity中实现它。

这些方法仅适用于android 5.0及以下版本!

简单的方法是:

尝试实例化第一个:

现在,您可以在此对象中调用方法和设置/获取字段:

// to set SSID
wifiConfiguration.Set("SSID", meSSID); // string
wifiConfiguration.Set("preSharedKey", mePassword); // string
设置完所有必填字段后,只需调用
setWifiApEnabled
方法:

wifiManager.Call<bool>("setWifiApEnabled", wifiConfiguration, enabled);

接线配置:

我试图找出为什么上面的代码可能不工作,但对我来说,它工作正常(在一些虚拟机和三星Galaxy S5 Neo上进行了测试)

可能的情况是(我在将近午夜时发现)一个密码短语。
根据关于WPA-PSK的章节

也称为WPA-PSK(预共享密钥)模式,该模式专为家庭和小型办公室网络设计,不需要身份验证服务器。[9]每个无线网络设备使用256位密钥加密网络流量。该密钥可以作为64位十六进制数字的字符串输入,也可以作为8到63个可打印ASCII字符的密码短语输入。[10]如果使用ASCII字符,则通过将PBKDF2密钥派生函数应用于密码短语来计算256位密钥,将SSID用作salt,HMAC-SHA1的4096次迭代。[11]WPA个人模式可用于WPA和WPA2。)

我的建议是使用与上面链接的文章相同的密码短语,以确保其有效

另一件需要注意的事情是SSID部分,它有一个简短但良好的描述

一个常见但不正确的假设是,SSID是由人类可读的字符(如ASCII)组成的字符串,以NUL字符(如在C字符串中)结尾。SSID必须按原样处理,即0–32个八位字节的序列,其中一些可能不是人类可读的

根据我的检查,您不需要在Java或C#中使用null终止字符串,因为它将由本机代码处理,但仍然不应超过31个字符(32个字符为null)

我用:
SSID:MeHotSpot

WPA-PSK:5260305714217573

非常接近。参数稍有错误。请检查问题。@程序员这不是重复的。OP询问关于打开热点(AP)而且不是WiFi。我的错。没有看到热点部分。值得知道的是为什么有人否决了这一点。我知道为什么你得到了否决票。这不应该起作用。
setWifiApEnabled
是一个隐藏函数,甚至没有文档记录。它需要反射才能起作用,所以你现在拥有的东西将不起作用。我可能错了,但还有几个过程要处理请像使用
方法
类…@程序员一样完成这项工作。这可能是正确的,但我的回答是一致的。但如果它真的需要反思或不需要反思,我仍在等待一些反馈。我会在需要时编辑我的答案。@m.rogalski非常感谢您的帮助。我根据您的说明修改了代码-在unity中有no错误,但安装后,应用程序在启动热点后关闭。是否指定了写入设置和更改连接的权限?
这应该可以在项目设置中更改。
wifiManager.Call<bool>("setWifiApEnabled", wifiConfiguration, enabled);
// 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);
                }
            }
        }
    }
}