web-dev-qa-db-fra.com

Changer le SSID et le mot de passe du hotspot WiFi en Android Oreo 8.x

Dans mon Android Android, j'utilise l'extrait de code suivant:

@RequiresApi(api = Build.VERSION_CODES.O)
private void turnOnHotspot(){
    WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);

    manager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback(){

        @Override
        public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) {
            super.onStarted(reservation);
            Log.d(TAG, "Wifi Hotspot is on now");
        }

        @Override
        public void onStopped() {
            super.onStopped();
            Log.d(TAG, "onStopped: ");
        }

        @Override
        public void onFailed(int reason) {
            super.onFailed(reason);
            Log.d(TAG, "onFailed: ");
        }
    },new Handler());
}

Ce morceau de code crée un hotspot nommé quelque chose comme "AndroidShare_1234". Pour un de mes projets, je dois pouvoir définir un mot de passe et un SSID sur ce point d'accès, mais je ne trouve pas de moyen de le faire. Je voudrais créer un hotspot avec un SSID comme MyHotspot et un mot de passe personnalisé.

Notez que le setWifiApEnabled n'est plus pris en charge dans Android O, c'est ainsi que cela se fait dans les anciennes versions d'Android. Cependant, j'ai encore besoin de créer par programmation un hotspot wifi avec un SSID et mot de passe. Je ne sais pas comment faire. Merci d'avance!

Pour qui s'en soucie ...:

Pour un projet d'école, j'ai créé un casier qui se déverrouille chaque fois qu'il peut se connecter à un réseau sans fil avec certains réseaux, d'où la nécessité de définir un hotspot par programme.

23
Markinson

Je n'ai qu'une solution partielle au problème. J'espère que cela suffira pour l'application que vous concevez.

Le SSID et le mot de passe sont codés en dur par le système Android lorsque vous démarrez le Hotspot. En regardant le code AOSP, je vois que le même hotspot peut être partagée par plusieurs applications. La configuration de ce hotspot (le nom de classe est WifiConfiguration) est également partagée avec toutes les applications demandeuses. Cette configuration est retransmise à l'application dans le rappel onStarted(LocalOnlyHotspotReservation reservation). Vous pouvez obtenir le WifiConfiguration en appelant reservation.getWifiConfiguration(). Vous obtiendrez toutes les informations dont vous avez besoin à partir de l'objet WifiConfiguration. Vous pourrez donc lire le Clé pré-partagée et nom du point d'accès. Mais je ne pense pas que vous puissiez les changer


Pour info, le code pertinent qui définit la configuration wifi (y compris le SSID codé en dur et la clé WPA2-PSK) est effectué par le morceau de code suivant

  /**
   * Generate a temporary WPA2 based configuration for use by the local only hotspot.
   * This config is not persisted and will not be stored by the WifiApConfigStore.
   */
   public static WifiConfiguration generateLocalOnlyHotspotConfig(Context context) {
       WifiConfiguration config = new WifiConfiguration();
       config.SSID = context.getResources().getString(
              R.string.wifi_localhotspot_configure_ssid_default) + "_"
                      + getRandomIntForDefaultSsid();
       config.allowedKeyManagement.set(KeyMgmt.WPA2_PSK);
       config.networkId = WifiConfiguration.LOCAL_ONLY_NETWORK_ID;
       String randomUUID = UUID.randomUUID().toString();
       // first 12 chars from xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
       config.preSharedKey = randomUUID.substring(0, 8) + randomUUID.substring(9, 13);
       return config;
   }
10
pellucide