Ошибка создания точки доступа Wi-Fi в oreo

Я работаю над простым системным приложением в 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

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

Я пробовал вышеуказанные изменения. Он включит точку доступа локально, но не получит пользовательский 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);

Ошибка создания точки доступа

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
1 393
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы включить 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");
   }
 });

Вам не нужно использовать отражение для версий >= Oreo. После того, как Android публично выставил API startLocalOnlyHotspot. Я подробно объяснил этот ответ в этом вопрос на Stackoveflow.

Другие вопросы по теме