Создание Wi-Fi Hotspot не удается в oreo - PullRequest
2 голосов
/ 08 апреля 2019

Я работаю над простым системным приложением в Oreo AOSP, чтобы включить точку доступа Wi-Fi с предопределенным SSID и предварительным ключом.

Так как мое приложение построено как системное приложение, нужно размышлять.

MainActivity.java

public class MainActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                boolean result = false;
                WifiManager mwifiManager;
                mwifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);

                try {
                        Method method = mwifiManager.getClass().getMethod("getWifiApConfiguration");
                        WifiConfiguration netconfig = (WifiConfiguration) method.invoke(mwifiManager);
                        netconfig.SSID = "DummyApp";
                        netconfig.preSharedKey = "1234567890";
                        netconfig.allowedKeyManagement.set(4);
                        mwifiManager.setWifiEnabled(false);
                        method = mwifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
                        result = (boolean) method.invoke(mwifiManager, netconfig, true);
                        if (!result) {
                                Toast.makeText(this, "Hotspot creation failed", Toast.LENGTH_SHORT).show();
                        } else {
                                Toast.makeText(this, "Wifi Enabled", Toast.LENGTH_SHORT).show();
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                }
                finish();
        }

        @Override
        protected void onResume() {
                super.onResume();
        }
}

AndroidManifest.xml

    android:protectionLevel="signature|privileged"
    android:sharedUserId="android.uid.system">
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />

    <!-- for wifi  -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
    <uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG" />

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.TETHER_PRIVILEGED" />

Wi-Fi должен включиться, но получить следующий результат:

Сообщение о тосте: не удалось создать точку доступа

Logcat: WifiManager: PACKAGE_NAME попытался вызвать setWifiApEnabled: enabled = true

update1: Как программно включить / выключить точку доступа Wi-Fi в Android 8.0 (Oreo)

Я пробовал вышеуказанные изменения. Он включит Hotspot локально, но не будет иметь никакого SSID и пароля.

update2: после получения ввода от @ Mr.AF.

Method setConfigMethod = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
                                                                                 ......code snip.........

netconfig.allowedKeyManagement.set(4);
Method Method = mWifiManager.getClass().getMethod("setWifiApConfiguration", WifiConfiguration.class);

Ошибка создания HOTSPOT

1 Ответ

2 голосов
/ 22 апреля 2019

Для включения Portable HotSpot в Android Nougat и ниже работает следующий код.

   Method method = mwifiManager.getClass().getMethod("getWifiApConfiguration");
   WifiConfiguration netconfig = (WifiConfiguration) method.invoke(mwifiManager);
   method = mwifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
   result = (boolean) method.invoke(mwifiManager, netconfig, true);

Выше API устарела в Oreo.

Ниже приведен скрытый API @system в oreo. Если приложение для Android построено как системное приложение, доступ к нему можно получить только под кодом API. В моем случае я могу использовать приведенный ниже API.

   ConnectivityManager oncm = (ConnectivityManager)ontext.getSystemService(Context.CONNECTIVITY_SERVICE);

   oncm.startTethering(ConnectivityManager.TETHERING_WIFI, true, new ConnectivityManager.OnStartTetheringCallback() {

   @Override
   public void onTetheringStarted() {
          super.onTetheringStarted();
          Log.i(TAG, "Hotspot is successfully opened");
   }

   @Override
   public void onTetheringFailed() {
          super.onTetheringFailed();
          Log.e(TAG, "Hotspot failed to open");
   }
 });
...