2017-12-07 121 views
13

W mojej aplikacji Android Używam następujący fragment kodu:Zmiana dostępu do sieci WiFi oraz hasło w Android Oreo 8.x

@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()); 
} 

Ten fragment kodu tworzy hotspot nazwie coś jak „AndroidShare_1234”. W przypadku mojego projektu muszę mieć możliwość ustawienia hasła i identyfikatora SSID dla tego hotspotu, jednak nie mogę znaleźć sposobu, aby to zrobić. Chciałbym utworzyć hotspot z identyfikatorem SSID, takim jak MyHotspot i niestandardowym hasłem.

Pamiętaj, że setWifiApEnabled nie jest już obsługiwany w Androidzie O, tak dzieje się w starszych wersjach Androida. Jednak nadal potrzebuję programowo utworzyć hotspot WiFi z identyfikatorem SSID i hasłem. Nie mogę wymyślić, jak to zrobić. Z góry dziękuję!

Dla kogo to obchodzi ...:

Dla szkolnego projektu zrobiłem szafkę, który otwiera, gdy może połączyć się z siecią bezprzewodową z pewnymi cridentials, stąd potrzeba ustawiania hotspot programowo.

+0

Nie mam dla ciebie odpowiedzi, ale czy rozważałeś użycie Bluetooth do przeprowadzenia uwierzytelnienia lub do opublikowania identyfikatora SSID? – nitzanms

+0

Należy zauważyć, że zgodnie z dokumentacją '' startLocalOnlyHotspot'' hotspot może być współużytkowany przez kilka aplikacji. Oznacza to, że modyfikacja identyfikatora SSID prawdopodobnie nie będzie oficjalnie obsługiwana. – nitzanms

Odpowiedz

2

Mam tylko częściowe rozwiązanie problemu. Mamy nadzieję, że będzie to wystarczające dla projektowanej aplikacji.

Identyfikator SSID i hasło są zakodowane na stałe przez system Android po uruchomieniu Hotspotu. Patrząc na kod AOSP, widzę, że ten sam hotspot może być współużytkowany przez wiele aplikacji. Ta konfiguracja tego hotspotu (nazwa klasy to WifiConfiguration) jest również udostępniana wszystkim aplikacjom wysyłającym żądania. Ta konfiguracja jest przekazywana do aplikacji w wywołaniu zwrotnym onStarted(LocalOnlyHotspotReservation reservation). Możesz uzyskać numer WifiConfiguration, dzwoniąc pod numer reservation.getWifiConfiguration(). Otrzymasz wszystkie potrzebne informacje z obiektu WifiConfiguration. Możesz więc przeczytać wstępnie udostępniony klucz i nazwę punktu dostępu. Ale nie sądzę, można je zmienić


FYI, Odpowiedni kod, który ustawia konfigurację WiFi (w tym zakodowanej SSID i klucz WPA2-PSK) odbywa się według następującego fragmentu kodu

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