Как создать wifihotspot в Oreo программно? - PullRequest
0 голосов
/ 04 мая 2018

Привет Учитывая ссылка Вопрос только показывает, как включить / выключить точку доступа Wi-Fi, но я хочу добавить создать точку доступа Wi-Fi с SSID и паролем. Я написал код для создания wifihotspot (как в NONE, так и в WPA2 PSK) в Android, и он прекрасно работает до Android 7, но в oreo он возвращает мне ложное значение. Сводка моего кода -

private WifiManager wifiManager;
private Method method;
private WifiConfiguration config;
config.SSID = ssid;
config.status = WifiConfiguration.Status.ENABLED;
method = wifiManager.getClass().getMethod("setWifiApEnabled",                                           
WifiConfiguration.class, Boolean.TYPE);
boolean status = (Boolean)  method.invoke(wifiManager, config, true);

Итак, мой вопрос: как создать wifihotspot в формате NONE и WPA2 PSK для Android Oreo? Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Oreo не поддерживает создание точки доступа программно без пароля. Он всегда создает точку доступа с уникальным ssid и ключом, генерируемым случайным образом.

 WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
 WifiManager.LocalOnlyHotspotReservation mReservation;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        assert manager != null;
        manager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() {

            @SuppressLint("SetTextI18n")
            @Override
            public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) {
                super.onStarted(reservation);
                Timber.d("Wifi Hotspot is on now , reservation is : %s", reservation.toString());
                mReservation = reservation;
                 key = mReservation.getWifiConfiguration().preSharedKey;
                 ussid = mReservation.getWifiConfiguration().SSID;


            }

            @Override
            public void onStopped() {
                super.onStopped();
                Timber.d("onStopped: ");
            }

            @Override
            public void onFailed(int reason) {
                super.onFailed(reason);
                Timber.d("onFailed: ");
            }
        }, new Handler());
    }
0 голосов
/ 04 мая 2018

setWifiApEnabled будет устаревшим. Глядя на исходный код, он всегда возвращает false:

/**
 * This call will be deprecated and removed in an upcoming release.  It is no longer used to
 * start WiFi Tethering.  Please use {@link ConnectivityManager#startTethering(int, boolean,
 * ConnectivityManager#OnStartTetheringCallback)} if
 * the caller has proper permissions.  Callers can also use the LocalOnlyHotspot feature for a
 * hotspot capable of communicating with co-located devices {@link
 * WifiManager#startLocalOnlyHotspot(LocalOnlyHotspotCallback)}.
 *
 * @param wifiConfig SSID, security and channel details as
 *        part of WifiConfiguration
 * @return {@code false}
 *
 * @hide
 */
@SystemApi
@RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED)
public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {
    String packageName = mContext.getOpPackageName();
    Log.w(TAG, packageName + " attempted call to setWifiApEnabled: enabled = " + enabled);
    return false;
}

Вы можете попробовать использовать ConnectivityManager#startTethering(int, boolean, ConnectivityManager#OnStartTetheringCallback), как сказано в javadoc. Я лично никогда не пробовал это.

...