Я получаю эту ошибку, когда я звоню 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"/>