android - 更改 Android 热点设置

标签 android android-wifi android-networking tethering

随着 API 级别 26 的发布,我的应用程序的核心功能出现了问题,即更改应用程序中用户的热点设置。 为了获取和设置此配置,我使用了来自 WifiManager 隐藏 api 的以下函数:getWifiApConfigurationsetWifiApConfiguration

Method getWifiApConfiguration = wifiManager.getClass().getMethod("getWifiApConfiguration");
getWifiApConfiguration.invoke(wifiManager);

这适用于 Android O 之前的设备,但在此版本中我收到以下错误:

App not allowed to read or update stored WiFi Ap config (uid = 10168)

我在 list 中声明的​​权限是:

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.NETWORK_STACK"/>
<uses-permission android:name="android.permission.TETHER_PRIVILEGED" />

如何使用最新的 API 执行此操作?

最佳答案

从 Android Oreo (26) 开始,新的权限检查被添加到 getWifiApConfiguration() 方法的服务实现中:

fragment 来自 WifiServiceImpl.java

/**
 * see {@link WifiManager#getWifiApConfiguration()}
 * @return soft access point configuration
 * @throws SecurityException if the caller does not have permission to retrieve the softap
 * config
 */
@Override
public WifiConfiguration getWifiApConfiguration() {
    enforceAccessPermission();
    int uid = Binder.getCallingUid();
    // only allow Settings UI to get the saved SoftApConfig
    if (!mWifiPermissionsUtil.checkConfigOverridePermission(uid)) {
        // random apps should not be allowed to read the user specified config
        throw new SecurityException("App not allowed to read or update stored WiFi Ap config "
                + "(uid = " + uid + ")");
    }
    mLog.trace("getWifiApConfiguration uid=%").c(uid).flush();
    return mWifiStateMachine.syncGetWifiApConfiguration();
}

深入研究代码,您会很快发现要成功调用此方法,您的应用程序必须持有 android.permission.OVERRIDE_WIFI_CONFIG 权限,这是系统级 protected 权限:

来自框架的 fragment AndroidManifest.xml

<!-- @SystemApi @hide Allows an application to modify any wifi configuration, even if created
 by another application. Once reconfigured the original creator cannot make any further
 modifications.
 <p>Not for use by third-party applications. -->
<permission android:name="android.permission.OVERRIDE_WIFI_CONFIG"
    android:protectionLevel="signature|privileged" />

这意味着您的应用程序需要由平台 key 签名或有权使用此 API。

关于android - 更改 Android 热点设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46392277/

相关文章:

java - PopUp-Window 作为后台任务 Android 应用程序

Android是设备连接到互联网的方法

android - 有什么办法可以嵌入可滚动的标签吗?

android - 如何更改设备名称? (无线亚行)

android - 可视化wifi信号强度

android - 是否可以为Android手机编写一个wifi破解工具?监控模式与多播?

android - 使用 (NDR) 网络发现存储库扫描网络时获取主机名及其类型

android - 我怎样才能拥有具有不同 TextView 和 Spinner 文本颜色的全局主题?

android - Android中的iOS StackView相当于什么

android - 最小 sdk 级别太低(如 8 sdk 级别)和目标 sdk 更高 sdk 级别(如 23 sdk 级别)有什么影响?