Android Kotlin开发:无需root权限分享当前已连接WiFi信息的方案咨询
无Root权限分享WiFi网络的可行方案
你提到的智能设备免输入密码配网能力,由Android官方提供的系统级API实现,全程不需要应用读取WiFi明文密码,以下是具体可落地的方案:
方案1:Companion Device Manager 配套设备配网API(兼容Android 8.0及以上)
这是Google Home、Netatmo等智能硬件配网应用采用的主流方案,专门为手机向配套智能设备传输WiFi凭证的场景设计,所有加密传输逻辑由系统处理,应用无需获取WiFi密码权限。
核心实现步骤(Kotlin):
- 申请基础权限:
ACCESS_FINE_LOCATION(获取当前连接WiFi的SSID)BLUETOOTH_CONNECT、BLUETOOTH_SCAN(适配Android 12+蓝牙权限要求)
- 构造配网请求拉起系统配网页面:
// 先通过WifiManager获取当前连接的WiFi SSID val wifiManager = getSystemService(WIFI_SERVICE) as WifiManager val currentSsid = wifiManager.connectionInfo.ssid.removeSurrounding("\"") // 构造WiFi配置,无需传入密码 val wifiConfig = WifiNetworkConfig.Builder() .setSsid(currentSsid) .build() // 构造配套设备配网配置 val deviceConfig = CompanionDeviceConfig.Builder() .addWifiNetworkConfig(wifiConfig) .build() // 拉起系统配网页面,用户选择目标蓝牙设备后系统自动完成WiFi信息传输 val associateIntent = Intent(CompanionDeviceManager.ACTION_ASSOCIATE) .putExtra(CompanionDeviceManager.EXTRA_COMPANION_DEVICE_CONFIG, deviceConfig) startActivityForResult(associateIntent, REQUEST_CODE_ASSOCIATE)
- 在
onActivityResult中接收配网结果即可,系统会自动完成WiFi凭证向目标蓝牙设备的加密传输。
方案2:Wi-Fi Easy Connect(DPP协议,兼容Android 10及以上)
该协议适配最新的WiFi配网标准,除了蓝牙传输外,还支持生成QR码供目标设备扫描配网,同样不需要应用获取WiFi明文密码,系统会直接生成加密的配网凭证。
核心实现逻辑:
调用WifiManager.startDppAsInitiator()方法传入当前连接WiFi的networkId,系统会生成DPP配网信息,你可以将该信息通过蓝牙发送给目标设备,支持DPP协议的设备收到信息后即可直接接入WiFi网络。
兼容说明
如果需要适配Android 8.0以下的设备,可以采用SmartConfig类广播配网方案,但该场景需要用户手动输入WiFi密码,没有系统级免密方案。
以上所有官方API均不需要Root权限,完全符合Google Play应用上架规范。
内容的提问来源于stack exchange,提问作者Dark Patate
相关产品推荐
相关产品推荐

