Подтвердить что ты не робот

Android M: невозможно удалить WIFI AP программно

В Android M: я использую приведенный ниже код для удаления текущей подключенной точки доступа WIFI.

void RemoveConnectedNetwork(){
    int ID=_wifiManager.getConnectionInfo().getNetworkId();
    Log.d("test", "network id = ["+ID+"]");
    boolen ret =_wifiManager.removeNetwork(ID);
    Log.d("test", "removeNetwork return ="+ret);
    _wifiManager.saveConfiguration();
}

но RemoveConnectedNetwork() всегда возвращает false.

Хотя этот API хорошо работал в предыдущих выпусках.

Любое решение, которое может быть достигнуто с помощью любого другого API в Android M?

Благодарю.

4b9b3361

Ответ 1

Есть некоторые изменения в Wifi Manager в Android 6.0.

Любая конфигурация Wi-Fi, созданная активным владельцем устройства, больше не может быть изменена или удалена пользователем, если WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN не равен нулю.

Пользователь по-прежнему может создавать и изменять свои собственные конфигурации Wi-Fi.

Владельцы активных устройств имеют право редактировать или удалять любые конфигурации Wi-Fi, в том числе не созданные ими.

Пожалуйста, обратитесь к этой ссылке для получения дополнительной информации: https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html

Ответ 2

В отличие от приложений Android M не разрешается изменять сети, которые они не создавали. Любая сеть может быть удалена из приложения, если она настроена самим этим приложением. Проверьте журнал из "WifiConfigManager" после вызова removeNetwork (int), вы получите сообщение об ошибке, например, этот UID (UID приложения) не имеет разрешения на удаление конфигурации (возможности "wifi SSID")

Существует так много причин для этого, обратитесь к следующему коду и ссылке для получения дополнительной информации. https://android.googlesource.com/platform/frameworks/opt/net/wifi/+/master/service/java/com/android/server/wifi/WifiConfigManager.java

/**
 * Checks if |uid| has permission to modify the provided configuration.
 *
 * @param config         WifiConfiguration object corresponding to the network to be modified.
 * @param uid            UID of the app requesting the modification.
 * @param ignoreLockdown Ignore the configuration lockdown checks for connection attempts.
 */
private boolean canModifyNetwork(WifiConfiguration config, int uid, boolean ignoreLockdown) {
    // System internals can always update networks; they're typically only
    // making meteredHint or meteredOverride changes
    if (uid == Process.SYSTEM_UID) {
        return true;
    }
    // Passpoint configurations are generated and managed by PasspointManager. They can be
    // added by either PasspointNetworkEvaluator (for auto connection) or Settings app
    // (for manual connection), and need to be removed once the connection is completed.
    // Since it is "owned" by us, so always allow us to modify them.
    if (config.isPasspoint() && uid == Process.WIFI_UID) {
        return true;
    }
    // EAP-SIM/AKA/AKA' network needs framework to update the anonymous identity provided
    // by authenticator back to the WifiConfiguration object.
    // Since it is "owned" by us, so always allow us to modify them.
    if (config.enterpriseConfig != null
            && uid == Process.WIFI_UID
            && TelephonyUtil.isSimEapMethod(config.enterpriseConfig.getEapMethod())) {
        return true;
    }
    final DevicePolicyManagerInternal dpmi = LocalServices.getService(
            DevicePolicyManagerInternal.class);
    final boolean isUidDeviceOwner = dpmi != null && dpmi.isActiveAdminWithPolicy(uid,
            DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
    // If |uid| corresponds to the device owner, allow all modifications.
    if (isUidDeviceOwner) {
        return true;
    }
    final boolean isCreator = (config.creatorUid == uid);
    // Check if the |uid| holds the |NETWORK_SETTINGS| permission if the caller asks us to
    // bypass the lockdown checks.
    if (ignoreLockdown) {
        return mWifiPermissionsUtil.checkNetworkSettingsPermission(uid);
    }
    // Check if device has DPM capability. If it has and |dpmi| is still null, then we
    // treat this case with suspicion and bail out.
    if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN)
            && dpmi == null) {
        Log.w(TAG, "Error retrieving DPMI service.");
        return false;
    }
    // WiFi config lockdown related logic. At this point we know uid is NOT a Device Owner.
    final boolean isConfigEligibleForLockdown = dpmi != null && dpmi.isActiveAdminWithPolicy(
            config.creatorUid, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
    if (!isConfigEligibleForLockdown) {
        return isCreator || mWifiPermissionsUtil.checkNetworkSettingsPermission(uid);
    }
    final ContentResolver resolver = mContext.getContentResolver();
    final boolean isLockdownFeatureEnabled = Settings.Global.getInt(resolver,
            Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN, 0) != 0;
    return !isLockdownFeatureEnabled
            && mWifiPermissionsUtil.checkNetworkSettingsPermission(uid);
}