CocosCreator系列——獲取手機網絡狀態並實時監聽切換狀態
基於CocosCreator2.2.1版本,新建一個hello world工程,然後打開HelloWorld.js腳本編輯代碼:
onGetNetState() {
var netWorkInfo = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "getNetWorkState", "()I")
if (!netWorkInfo) {
cc.log("當前無返回!!!!!!!!!!!!!!!!!!!!!!!!");
return
}
if (netWorkInfo == 1) {
this.netLab.string = "發生變化,移動網絡";
} else if (netWorkInfo == 2) {
this.netLab.string = "發生變化,wifi網絡";
} else {
this.netLab.string = "無網絡";
}
}
然後在onLoad()裏面調用
if (cc.sys.isNative && cc.sys.os == cc.sys.OS_ANDROID) {
this.schedule(() => {
this.onGetNetState();
}, 3)
}
接下來打開AppActivity.java編輯Java原生代碼,首先聲明當前AppActivity並初始化,聲明用來返回數據的變量netState 和初始化NetworkStateBroadcastReceiver
private static AppActivity app = null;
public static int netState = -1;
private static NetworkStateBroadcastReceiver broadcastReceiver = null;
然後寫NetworkStateBroadcastReceiver類,繼承BroadcastReceiver
public class NetworkStateBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equalsIgnoreCase(WifiManager.WIFI_STATE_CHANGED_ACTION)){
wifiStateChange(context, intent);
}else{
networkChange(context);
}
}
public void wifiStateChange(Context context, Intent intent){
int wifi_state = intent.getIntExtra("wifi_state", 0);
int level = Math.abs(((WifiManager)context.getSystemService(Context.WIFI_SERVICE)).getConnectionInfo().getRssi());
Log.e("network", "wifi狀態:" + wifi_state + "; wifi強度:" + level);
}
public void networkChange(Context context){
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if(networkInfo != null){
int type = networkInfo.getType();
switch (type) {
case ConnectivityManager.TYPE_MOBILE:
netState = 1;
Log.e("network", "手機網絡");
break;
case ConnectivityManager.TYPE_WIFI:
netState = 2;
Log.e("network", "wifi網絡");
break;
}
}else{
Log.e("network", "沒有網絡");
}
}
}
接下來在onCreate()裏面爲AppActivity賦值,並註冊監聽手機電量服務
app = this;
app.broadcastReceiver = new NetworkStateBroadcastReceiver();
IntentFilter filter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
registerReceiver(broadcastReceiver, filter);
下面該寫一個用來返回js客戶端的方法了,netState在NetworkStateBroadcastReceiver類裏面根據網絡狀態切換來存儲
public static int getNetWorkState(){
return netState;
}
在onDestroy()裏面註銷服務
if(broadcastReceiver!=null){
app.unregisterReceiver(broadcastReceiver);
}
建議用Android studio打開項目,缺少哪個引用直接alt+enter引入相應的模塊就行了
最後一步,檢查AndroidManifest.xml裏面有沒有聲明權限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
大功告成!!!!!!!!!!!!!!!!!
其實懂了以後挺簡單的,剛開始不懂安卓原生,網上找了好多安卓的教程,大部分都是老版本了,試了好多都不行,爲了與時俱進,還是要多多學習,經常更新迭代啊!!!!!!!!!!!!!
O(∩_∩)O
補充說明:如果需要顯示WiFi鏈接強度的話,可以再聲明一個變量來存儲,WiFi強度在wifiStateChange()方法裏面,log裏面有,level就是