Как создать Wi-Fi-модем Hotspot в Android Marshmallow?

Я пытался создать Wi-Fi-модем Hotspot в Android Marshmallow, используя следующий код.

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.

Но я уже добавил их в манифест.,

Как я могу решить проблему?

1 ответ

Я работал в Android Marshmallow и нашел способ создать модем WiFi, как описано ниже. Обратите внимание, что в соответствии с Android 6.0 Изменения Ваши приложения теперь могут изменять состояние объектов WifiConfiguration, только если вы создали эти объекты. Начиная с Android 6.0 (уровень API 23), пользователи предоставляют разрешения приложениям во время работы приложения, а не при установке приложения. Прочтите эту статью, чтобы узнать больше об этом. Я вижу, вы сами создаете Hotspot. Так что нет проблем. Разрешение в Манифесте дано ниже:

<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"/>

Я использую следующую функцию для создания Wi-Fi-модема в Android-зефире:

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

Включение Hotspot вызывает функцию: setWifiTetheringEnabled(true) и для отключения setWifiTetheringEnabled(false),

Вот и все.

Обратите внимание, что устройства без SIM-карты не поддерживаются для использования Hotspot. Вы не сможете создать Hotspot на этих устройствах без рута.

Надеюсь, что это будет полезно для будущих посетителей.

Другие вопросы по тегам