1 问题
Android10.0设备通过热点名字和密码连接另外一台设置指定热点,但是他们之间依然不能通信,网络不可达。
Android10.0设备通过热点名字和密码连接另外一台设置指定热点,我用的是官方API,可以参考我的这篇博客
Android之通过用户名和密码连接指定wifi热点(兼容Android9.0和Android10.0和addNetwork(wifiNewConfiguration)返回-1问题)
Android10.0连接热点关键代码如下
boolean isOpenWifi = mWifiManager.isWifiEnabled();
if (!isOpenWifi) {
Log.i(TAG, "用户需要打开wifi开关");
context.startActivity(new Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY));
callBack.connnectResult(false);
return;
}
NetworkSpecifier specifier =
new WifiNetworkSpecifier.Builder()
.setSsidPattern(new PatternMatcher(wifiApName, PatternMatcher.PATTERN_PREFIX))
.setWpa2Passphrase(password)
.build();
NetworkRequest request =
new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(specifier)
.build();
ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
// do success processing here..
Log.i(TAG, "onAvailable success");
Log.i(TAG, "network" + network.toString());
callBack.connnectResult(true);
}
@Override
public void onUnavailable() {
// do failure processing here..
Log.i(TAG, "onUnavailable fail");
callBack.connnectResult(false);
}
};
connectivityManager.requestNetwork(request, networkCallback);
2 分析
我们查看竞品 "茄子快传",发现Android10.0设备通过热点名字和密码连接另外一台设置指定热点,然后连接成功后可以正常通信,我们先用jadx反编译茄子代码,然后搜索上面官方API的关键字WifiNetworkSpecifier
没有搜索到,然后我们用官方的10.0API也会让手机弹出提示,让用户同意,但是竞品没有这个提示,就说明它用的不是这个方式连接指定热点的,但是依然可以连接上后正常通信,我们分析是不是用了其它特殊方式,我们打开竞品扫描二维码,然后抓当前进程打印的日志
adb shell ps | grep share
adb logcat | grep pid
依然没有发现什么线索,然后就全局搜索关键字enableNetwork
也就只有这几处,然后我们就再到网上找为什么Android10.0设备enableNetwork 返回-1