android - 如何在 Android Marshmallow 中创建 wifi 网络共享热点?

标签 android android-wifi android-6.0-marshmallow tethering

我尝试使用以下代码在 Android Marshmallow 中创建 Wi-Fi 网络共享热点。

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

但它显示了以下权限问题:

java.lang.SecurityException: googleplus.tarun.info.hotspotcreation was not granted  either of these permissions: android.permission.CHANGE_NETWORK_STATE, android.permission.WRITE_SETTINGS.

即使我已经在 list 中添加了那些。

我该如何解决这个问题?

最佳答案

我在 Android Marshmallow 工作,找到了一种创建 WiFi 网络共享的方法,如下所述。注意根据Android 6.0 Changes仅当您创建了 WifiConfiguration 对象时,您的应用程序现在才能更改这些对象的状态。从 Android 6.0(API 级别 23)开始,用户在应用运行时授予应用权限,而不是在安装应用时。 Read this article to know more about this.我可以看到你正在自己创建热点。所以没问题。 list 中的权限如下:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>

我正在使用以下函数在 android marshmallow 中创建 WiFi 网络共享热点:

public void setWifiTetheringEnabled(boolean enable) {
    //Log.d(TAG,"setWifiTetheringEnabled: "+enable);
    String SSID=getHotspotName(); // my function is to get a predefined SSID
    String PASS=getHotspotPassword(); // my function is to get a predefined a Password

    WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);

    if(enable){
        wifiManager.setWifiEnabled(!enable);    // Disable all existing WiFi Network
    }else {
        if(!wifiManager.isWifiEnabled())
            wifiManager.setWifiEnabled(!enable);
    }
    Method[] methods = wifiManager.getClass().getDeclaredMethods();
    for (Method method : methods) {
        if (method.getName().equals("setWifiApEnabled")) {
            WifiConfiguration netConfig = new WifiConfiguration();
            if(!SSID.isEmpty() || !PASS.isEmpty()){
                netConfig.SSID=SSID;
                netConfig.preSharedKey = PASS;
                netConfig.hiddenSSID = false;
                netConfig.status = WifiConfiguration.Status.ENABLED;
                netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
                netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
                netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
                netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
                netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
                netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
                netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
            }
            try {
                method.invoke(wifiManager, netConfig, enable);
                Log.e(TAG,"set hotspot enable method");
            } catch (Exception ex) {
            }
            break;
        }
    }
}

启用热点的函数调用是:setWifiTetheringEnabled(true) 和禁用 setWifiTetheringEnabled(false)

就是这样。

注意请注意,不支持无 SIM 设备使用热点。如果没有 root,您将无法在这些设备上创建热点。

希望这对即将到来的访客有所帮助。

关于android - 如何在 Android Marshmallow 中创建 wifi 网络共享热点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34172369/

相关文章:

android - android 6.0+下如何使用TabHost

Android - 从 PDU 已弃用的 API 创建 SMS?

Android/Facebook - 为什么 Facebook 登录页面一直在变化?

android - Gradle 同步失败 : Failed to create parent directory

android - 收到 WIFI_STATE_ENABLED 后,WifiInfo SSID 立即为空

java - 如何从应用程序启用/禁用 WiFi?

android - 为 android 4.1 设备编译和构建 “iw”?

Android: Intent 通过通知传递给 Activity ......我没有在 Intent 中获得正确的额外内容

android - fragment 选项卡 viewpager 问题

android - 在 Marshmallow (Android 6) 上使用 TTS 中的声音文件因权限问题而失败