Android之解決Android10.0通過熱點名字和密碼連接指定熱點網絡不能通信問題

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

 

 

這裏可以看出把targetSdkVersion調整成28就可以了,我們不用29的API,同時我們也猜測競品“茄子快傳”也是用的這種方式繞過去的

查看AndroidManifest.xml,果不其然。

 

 

 

 

 

3 解決辦法

暫時降低targetSdkVersion的本版爲28,暫時繞過去,我自己測試部分Android10.0的手機,的確沒問題,但是APP需要谷歌上架,到時候會強制升級到29,到時候再說,說不定Android11出來這個問題就自然而然解決了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章