以编程方式打开Wifi热点共享

8
能否通过编程的方式打开wifi热点以启用数据共享?我尝试了这里这里的代码。这两个例子都可以正常执行,但是当我查看wifi设置中的“数据共享和便携式热点”部分时,数据共享仍然被禁用。这只适用于内部Google应用程序吗?
编辑:我正在使用Android 5.1,而且我想在不root手机的情况下完成此操作。
1个回答

7
尝试以下代码,以编程方式打开 WiFi 共享功能。我已测试过,在我的应用程序中可以工作。
public class WifiAccessManager {

    private static final String SSID = "1234567890abcdef";
    public static boolean setWifiApState(Context context, boolean enabled) {
        //config = Preconditions.checkNotNull(config);
        try {
            WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            if (enabled) {
                mWifiManager.setWifiEnabled(false);
            }
            WifiConfiguration conf = getWifiApConfiguration();
            mWifiManager.addNetwork(conf);

            return (Boolean) mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class).invoke(mWifiManager, conf, enabled);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public static WifiConfiguration getWifiApConfiguration() {
        WifiConfiguration conf = new WifiConfiguration();
        conf.SSID =  SSID;
        conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        return conf;
    }
}

使用方法:

WifiAccessManager.setWifiApState(context, true);

需要权限:

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

谢谢您的快速回复!这确实成功关闭了WiFi,但setWifiApState返回false,且无法激活热点共享。我需要一个已经root的手机吗?我想在不root手机的情况下完成这个操作。 - CalumMcCall
@CalumMcCall 我需要一个已经root的手机吗?我不认为需要,因为我的设备没有root也可以工作。 - Dhaval Patel
1
@CalumMcCall 也许你应该在 setWifiApState 方法中尝试使用 printStackTrace 来查看错误。 - Dhaval Patel
原来我缺少了“CHANGE_NETWORK_STATE”权限。感谢您的帮助! - CalumMcCall
2
这个在 Marshmallow 版本之前很好用,但现在不再起作用了。有什么想法可以让它在 Android 6 及以上版本中运行?可能是新的权限问题。他们改变了所有这些,但我不知道该去哪里寻找。 - stu
据我所知,他们在marshmallow中破坏了它。有人知道如何让它再次工作吗? - stu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接