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

标签 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 以来真的没有办法做到这一点吗?

最佳答案

虽然这不是一个合适的解决方案,但如果没有其他选择,您可以尝试一下。

首先:检查热点是否激活

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;
}

第二:如果热点处于 Activity 状态,请先打开 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);
}

关于android - 如何在 Android >= 7.1(包括共享互联网访问)上以编程方式打开 Wifi-Hotspot?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46278186/

相关文章:

java - Android:多 ImageView

java - WebView 和 Nexus Chrome 浏览器的工作方式与我在 PC 上的 Chrome 浏览器不同

android - Toast maketext 消息中的图像图标

android - 如何创建基于 MonoGame 的类库以供 UWP、iOS 和 Android 使用

android - 如何在 Activity 中的 API 调用上从 ViewModel 获取错误?

android - EditText 的 android :nextFocusDown attibute stops working when onClick is set

android - 如何在 Kotlin 中初始化 Array<List<Model>>?

android - 在android中是否有任何直接执行查询并返回游标的方法?

android - Kotlin在与 Activity 不同的布局上更新textview的文本

java - 在 Android 应用程序中实现静音按钮的简单方法