Почему для вызова WifiManager.setWifiEnabled () требуется разрешение INTERACT_ACROSS_USERS? - PullRequest
0 голосов
/ 06 июня 2019

Я получаю эту ошибку, когда я звоню setWifiEnabled(true) в моем приложении:

W/ActivityManager( 3018): Permission Denial: getCurrentUser() from pid=21765, uid=10121 requires android.permission.INTERACT_ACROSS_USERS
W/WifiService( 3018): java.lang.SecurityException: Permission Denial: getCurrentUser() from pid=21765, uid=10121 requires android.permission.INTERACT_ACROSS_USERS

Я не знаю, почему это происходит, потому что в спецификации этого метода сказано, что для этого требуется только Manifest.permission.CHANGE_WIFI_STATE. Я знаю, что этот метод будет устаревшим на уровне API 29, но я нацеливаюсь на API 24.

Я проверил, что это происходит в Android 5.1.1 (уровень API 22), но не в Android 8.1.0 (уровень API 27)

Я проверил исходный код WifiManager, чтобы выяснить, почему o, где getCurrentUser() вызывается, но я не смог его найти

public synchronized boolean setWifiEnabled(boolean enable) {
    enforceChangePermission();
    Slog.d(TAG, "setWifiEnabled: " + enable + " pid=" + Binder.getCallingPid()
                + ", uid=" + Binder.getCallingUid());
    if (DBG) {
        Slog.e(TAG, "Invoking mWifiStateMachine.setWifiEnabled\n");
    }
    /*
    * Caller might not have WRITE_SECURE_SETTINGS,
    * only CHANGE_WIFI_STATE is enforced
    */
    long ident = Binder.clearCallingIdentity();
    try {
        if (! mSettingsStore.handleWifiToggled(enable)) {
            // Nothing to do if wifi cannot be toggled
            return true;
        }
    } finally {
        Binder.restoreCallingIdentity(ident);
    }
    mWifiController.sendMessage(CMD_WIFI_TOGGLED);
    return true;
}

Я добавил это в свой AndroidManifest.xml, но ничего не произошло:

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