如何在Android> = 7.1(包括共享互联网访问权限)上以编程方式启用Wifi-Hotspot?

时间:2017-09-18 11:28:01

标签: android

我们一直在使用反射来启用Android中的wifi热点与我们的应用程序(就像其他所有人一样):

WifiManager mWifiManager = (WifiManager) this.context.getSystemService(Context.WIFI_SERVICE);
Method method = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
method.invoke(mWifiManager, wifiConfig, enabled);

自从Android 7.1以来,这已不再适用了。虽然它启动了热点(我在信息栏中看到了热点图标),但连接客户端无法使用手机的互联网连接。

随着Oreo(Android 8.0)的出现,情况越来越糟,因为它根本没有做任何事情。

我找到了一个仅限本地热点的解决方案: How to turn on/off wifi hotspot programatically in Android 8.0 (Oreo) 但我们需要共享互联网连接,所以我们不能使用这个。

对我们来说,拥有root权限也无法解决问题。

我们是否错过任何官方或非官方的方式来实现我们的目标,或者自从Android 7.1以来是否真的没有办法实现这一目标?

1 个答案:

答案 0 :(得分:-1)

虽然它不是一个合适的解决方案,但如果没有替代方案,你可以尝试一下。

首先:检查HOTSPOT是否激活

boolean isHotSpotActive(Context cxt)
{
    boolean isSuccess = false;
    WifiManager wifi = (WifiManager)cxt.getSystemService(Context.WIFI_SERVICE);
    Method[] wmMethods = wifi.getClass().getDeclaredMethods();
    for (Method method : wmMethods)
    {
        if (method.getName().equals("isWifiApEnabled"))
        {
            try 
            {
                boolean isWifiApEnabled = (boolean)method.invoke(wifi);
                isSuccess = isWifiApEnabled;
            }catch (IllegalArgumentException e){
                e.printStackTrace();
            }catch (IllegalAccessException e){
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }
    return  isSuccess;
}

第二:如果热点处于活动状态,请打开Wifi然后再关闭。

WifiManager wifimanager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
boolean isWifiOn =  wifimanager.setWifiEnabled(true); // turning wifi on 
//will turn off the hotspot
if(isWifiOn)
{
    wifimanager.setWifiEnabled(false);
}