最新做的游戏界面要显示设备的当前网络,电量等信息。故此,写下这篇博客,相当于自己的一个复习吧。
ps:这里只需要区分移动数据和wifi即可,具体需要区分运营商请自行补全。
由于网络相关信息是底层信息,故此调用的底层接口。
移动数据状态可以用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中添加 否则无法获得系统的许可。
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------------------------------------------
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------------------------------------------