CocosCreator系列——獲取手機網絡狀態並實時監聽切換狀態

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就是

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