Включение и выключение rnet android - PullRequest
0 голосов
/ 18 февраля 2020

Есть ли способ включить и выключить ethe rnet программно, подобно тому, как можно включать и выключать WiFi через класс WiFiManager? Я считаю, что ifconfig down / up не будет работать, так как для этого потребуется root. Я попробовал сделать ifconfig wlan0 down в эмуляторе терминала, что дало мне разрешение на отказ.

Я на некорневом устройстве.

1 Ответ

0 голосов
/ 18 февраля 2020

во-первых, вы должны знать, поскольку класс android Q, WifiManager не работает.

Этот метод устарел на уровне API 29. Начиная с Build.VERSION_CODES # Q, приложения не разрешено включать / отключать Wi-Fi. Примечание о совместимости: для приложений, нацеленных на Build.VERSION_CODES.Q или выше, этот API всегда будет возвращать false и не будет иметь никакого эффекта. Если приложения нацелены на более старый SDK (Build.VERSION_CODES.P или ниже), они могут продолжать использовать этот API.

Как для сети, так и для Wi-Fi, я предлагаю вам показать диалоговое окно с разрешениями, пользователь откроет его, он соответствует диспетчеру разрешений android.

. Вы можете использовать следующий код, чтобы открыть параметр

Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setComponent(new ComponentName("com.android.settings",
                "com.android.settings.Settings$DataUsageSummaryActivity"));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);

, если целевой SDK ниже Q, вы можете попробовать используйте способ отражения.

private void setMobileDataEnabled(Context context, boolean enabled) throws Exception{
    final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    Class conmanClass = null;
    try {
        conmanClass = Class.forName(conman.getClass().getName());
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
    iConnectivityManagerField.setAccessible(true);
    final Object iConnectivityManager = iConnectivityManagerField.get(conman);
    final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
    final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
    setMobileDataEnabledMethod.setAccessible(true);
    setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
}
...