Cocos2dx 获取安卓手机网络类型及强度,电量等信息

来源:互联网 发布:js设置input隐藏显示 编辑:程序博客网 时间:2024/04/30 09:02

最新做的游戏界面要显示设备的当前网络,电量等信息。故此,写下这篇博客,相当于自己的一个复习吧。

获取网络类型及网络强度

ps:这里只需要区分移动数据和wifi即可,具体需要区分运营商请自行补全。

Java层获取相关信息

由于网络相关信息是底层信息,故此调用的底层接口。
移动数据状态可以用TelephonyManager监听LISTEN_SIGNAL_STRENGTHS的方式进行获取,在发生变化时会自动通知。
wifi采用WifiManager监听WIFI_SERVICE的方式进行。在发生变化时会自动通知。
ps:这里网络强度分为移动网络和wifi

声明相关变量:

//网络状态强度    public static final int NETLEVEL_STRENGTH_NONE_OR_UNKNOWN = 0;    public static final int NETLEVEL_STRENGTH_POOR = 1;    public static final int NETLEVEL_STRENGTH_MODERATE = 2;    public static final int NETLEVEL_STRENGTH_GOOD = 3;    public static final int NETLEVEL_STRENGTH_GREAT = 4;    //信号监听    TelephonyManager        Tel;      MyPhoneStateListener    MyListener;     public static int singnalLevel;    //Wifi监听    private static WifiInfo wifiInfo = null;    private static WifiManager wifiManager = null;     public static int wifiLevel;

在onCreate等方法中添加监听:

//添加信号强度监听        MyListener = new MyPhoneStateListener();        Tel = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);        Tel.listen(MyListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);        //添加wifi强度监听        wifiManager = (WifiManager)getSystemService(WIFI_SERVICE);
 @Override    protected void onPause() {        super.onPause();        Tel.listen(MyListener, PhoneStateListener.LISTEN_NONE);    }    @Override    protected void onResume() {        super.onResume();        Tel.listen(MyListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);    }

获取信息代码:

ps:这里向C++传值的时候用到了数组,定义了返回值会数组的java方法:public static int[] getNetInfo(){…}

//--------------------------------------网络类型及强度  begin------------------------------------------    //定义数组用于返回    static int[] netInfo = new int[2];    //netType   -1: 没有网络    1: WIFI     2: 移动数据    //netLevel  1: None 2:poor  3:moderate  4:good  5:great     public static int[] getNetInfo() {        Log.d("getNetInfo", "enter the function getNetInfo ----- ");        //根据Android的安全机制,在使用ConnectivityManager时,必须在AndroidManifest.xml中添加<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 否则无法获得系统的许可。        ConnectivityManager connMgr = (ConnectivityManager)appactivity.getSystemService(Context.CONNECTIVITY_SERVICE);        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();        if( null == networkInfo)            return netInfo;        int nType = networkInfo.getType();        if (nType == ConnectivityManager.TYPE_MOBILE) {            netInfo[0] = 2;        }        else if (nType == ConnectivityManager.TYPE_WIFI) {            netInfo[0] = 1;        }        Log.d("getNetInfo", "java ---- netType --- "+ netInfo[0]);        //according to netType. set the value of netLevel        switch (netInfo[0]) {        case 1:            netInfo[1] = getWifiLevel();            break;        case 2:            netInfo[1] = getSingnalLevel();            break;        default:            break;        }        Log.d("getNetInfo", "java ---- netLevel --- "+ netInfo[1]);        return netInfo;    }    //信号强度等级    private class MyPhoneStateListener extends PhoneStateListener      {        @Override        public void onSignalStrengthsChanged(SignalStrength signalStrength)        {           super.onSignalStrengthsChanged(signalStrength);           int asu = signalStrength.getGsmSignalStrength();         if (asu <= 2 || asu == 99) singnalLevel = NETLEVEL_STRENGTH_NONE_OR_UNKNOWN;         else if (asu >= 12) singnalLevel = NETLEVEL_STRENGTH_GREAT;         else if (asu >= 8)  singnalLevel = NETLEVEL_STRENGTH_GOOD;         else if (asu >= 5)  singnalLevel = NETLEVEL_STRENGTH_MODERATE;         else singnalLevel = NETLEVEL_STRENGTH_POOR;      }      };/* End of private Class */      //获取信号强度    public static int getSingnalLevel() {         return singnalLevel;    }    //获取wifi强度    public static int getWifiLevel() {        wifiInfo = wifiManager.getConnectionInfo();        int wifiStrength = wifiInfo.getRssi();        if (wifiStrength <= 0 && wifiStrength >= -50) {              wifiLevel = NETLEVEL_STRENGTH_GREAT;        } else if (wifiStrength < -50 && wifiStrength >= -70) {              wifiLevel = NETLEVEL_STRENGTH_GOOD;         } else if (wifiStrength < -70 && wifiStrength >= -80) {              wifiLevel = NETLEVEL_STRENGTH_MODERATE;        } else if (wifiStrength < -80 && wifiStrength >= -100) {              wifiLevel = NETLEVEL_STRENGTH_POOR;         } else {              wifiLevel = NETLEVEL_STRENGTH_NONE_OR_UNKNOWN;         }         return wifiLevel;    }//--------------------------------------网络类型及强度  end------------------------------------------  

C++端接收返回的网络类型和状态

    void getNetInfo(int &netType, int &netLevel)    {#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID        JniMethodInfo t;        bool isHave = JniHelper::getStaticMethodInfo(t, JAVA_CLASSNAME, "getNetInfo", "()[I");        if (isHave)        {            jintArray msg = (jintArray)t.env->CallStaticObjectMethod(t.classID, t.methodID);            int len = t.env->GetArrayLength(msg);            jint* elems =t.env-> GetIntArrayElements(msg, 0);             if (2 == len)            {                netType = elems[0];                netLevel = elems[1];            }            log(" netType :%d----------netLevel: %d ----------- %d", netType, netLevel, len);            t.env->DeleteLocalRef(t.classID);        }        else        {            cocos2d::log("JniFun call getNetInfo error!");        }#endif    }

获取电量相关信息

android层面可以利用BroadcastReceiver机制,获取电池电量变化的ACTION_BATTERY_CHANGED intent,进而获取当前android设备的电池状态。(这里只获取了电量。)
步骤:
1. 创建一个监听ACTION_BATTERY_CHANGED事件的intentFilter。
2. 创建一个BroadcastReceiver对象,该对象可以接收broadcast intent。
3. 注册BroadcastReceiver对象来监听ACTION_BATTERY_CHANGED事件。
4. 在BroadcastReceiver对象中,重写onReceive方法,在onReceive方法的传入参数intent里获取需要的电池状态信息。
5. 在生命周期结束时,取消step4中的注册。

声明相关变量

/电量数值    BatteryBroadcastReceiver receiver = new BatteryBroadcastReceiver();    IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);    public static int batteryLevel = 0;

添加及注销监听

onCreate方法

//添加电量信息监听        registerReceiver(receiver, filter);
 @Override    protected void onResume() {        super.onResume();        registerReceiver(receiver, filter);    }    @Override    protected void onDestroy() {        super.onDestroy();        unregisterReceiver(receiver);    }

具体获取方法

//--------------------------------------电量信息  begin------------------------------------------    class BatteryBroadcastReceiver extends BroadcastReceiver{        @Override        public void onReceive(Context context, Intent intent) {            // TODO Auto-generated method stub            //判断它是否是为电量变化的Broadcast Action            if(Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())){                //获取当前电量                int level = intent.getIntExtra("level", 0);                //电量的总刻度                int scale = intent.getIntExtra("scale", 100);                //把它转成百分比                batteryLevel =  level * 100 / scale;            }        }    }    //获取电量信息    public static int getBatteryLevel() {        return batteryLevel;    }  //--------------------------------------电量信息  end------------------------------------------
2 0
原创粉丝点击