Измените SSID и пароль точки доступа Wi-Fi в Android Oreo 8.x

В моем приложении для Android я использую следующий фрагмент кода:

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

Этот фрагмент кода создает точку доступа с именем вроде «AndroidShare_1234». Для моего проекта мне нужно иметь возможность установить пароль и SSID для этой точки доступа, однако я не могу найти способ сделать это. Я хочу создать точку доступа с SSID, например MyHotspot, и настраиваемым паролем.

Обратите внимание, что setWifiApEnabled больше не поддерживается в Android O, именно так это делается в более старых версиях Android. Однако мне все еще нужно программно создать точку доступа Wi-Fi с SSID и паролем. Я не могу понять, как это сделать. Заранее спасибо!

Кому интересно ...

Для школьного проекта я сделал шкафчик, который разблокируется всякий раз, когда он может подключиться к беспроводной сети с определенными критериями, отсюда и необходимость программной установки точки доступа.


person Markinson    schedule 07.12.2017    source источник
comment
У меня нет ответа, но рассматривали ли вы возможность использования Bluetooth либо для аутентификации, либо для публикации сетевого SSID?   -  person nitzanms    schedule 11.12.2017
comment
Обратите внимание, что согласно документации startLocalOnlyHotspot, точка доступа может совместно использоваться несколькими приложениями. Это указывает на то, что изменение SSID вряд ли будет официально поддерживаться.   -  person nitzanms    schedule 11.12.2017
comment
Эй, ты когда-нибудь находил решение этой проблемы?   -  person Visionwriter    schedule 12.03.2018
comment
@Visionwriter нет :(   -  person Markinson    schedule 12.03.2018
comment
@Markinson вы уже нашли решение?   -  person Karan Malhotra    schedule 22.07.2020


Ответы (1)


У меня есть лишь частичное решение проблемы. Надеюсь, этого будет достаточно для разрабатываемого вами приложения.

SSID и пароль жестко запрограммированы системой Android при запуске точки доступа. Просматривая код AOSP, я вижу, что одна и та же точка доступа может использоваться несколькими приложениями. Конфигурация этой точки доступа (имя класса WifiConfiguration) также используется всеми запрашивающими приложениями. Эта конфигурация передается обратно в приложение в обратном вызове onStarted(LocalOnlyHotspotReservation reservation). Вы можете получить WifiConfiguration, позвонив по телефону reservation.getWifiConfiguration(). Вы получите всю необходимую информацию от объекта WifiConfiguration. Таким образом, вы можете прочитать общий ключ и имя точки доступа. Но я не думаю, что вы можете их изменить


К вашему сведению, соответствующий код, который устанавливает конфигурацию Wi-Fi (включая жестко запрограммированный SSID и ключ WPA2-PSK), выполняется следующей частью код

  /**
   * 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;
   }
person pellucide    schedule 13.12.2017
comment
Спасибо за ответ ......_ 1_ сообщите нам формат, пожалуйста .. - person Gowthaman M; 31.08.2018
comment
пожалуйста, помогите мне сэр - person Gowthaman M; 31.08.2018
comment
Изменить SSID невозможно. - person pellucide; 04.09.2018
comment
есть ли какое-либо обходное решение для этого .... Я хочу создать имя точки доступа с каким-то конкретным именем, сэр .. - person Gowthaman M; 04.09.2018
comment
@Gowthamam, насколько я знаю, нет способа установить конкретное имя. - person pellucide; 09.09.2018
comment
Еще же не повлияет на название! - person HandyPawan; 10.09.2019
comment
Для нашего случая использования нам также необходимо программно установить ssid и пароль. Любое решение ценится. - person Sudhir; 21.01.2020