Cocos2d-x 没有统一的电池信息接口,需要分别在原生层读取,再通过 LuaJ、LuaObjcBridge 或自定义 C++ 绑定回传。两端原生状态枚举不同,建议在桥接层先转换为项目约定的状态值。
Android 平台
ACTION_BATTERY_CHANGED 会提供当前电量和状态。scale 可能异常,应先防止除零;若只需要读取一次,可直接获取当前 intent,不必长期持有接收器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| private BroadcastReceiver batteryReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int level = intent.getIntExtra("level", 0); int scale = intent.getIntExtra("scale", 100); int status = intent.getIntExtra("status", 0); int percent = scale > 0 ? level * 100 / scale : -1; } };
@Override protected void onResume() { super.onResume(); registerReceiver(batteryReceiver,new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); }
@Override protected void onPause() { super.onPause(); unregisterReceiver(batteryReceiver); }
|
iOS 平台
读取 batteryLevel 和 batteryState 前要先开启 batteryMonitoringEnabled。未开启监控时,系统会返回未知状态,电量可能为 -1.0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| +(NSString *) getBatteryInfo{ // 监听电池信息 UIDevice *device = [UIDevice currentDevice]; if (!device.isBatteryMonitoringEnabled){ device.batteryMonitoringEnabled = YES; } // 获取电池信息 UIDeviceBatteryState battery_state = device.batteryState; CGFloat battery_level = device.batteryLevel;
int state = 0; switch (battery_state) { case UIDeviceBatteryStateUnknown: state = 0; break; case UIDeviceBatteryStateCharging: // 充电中 state = 1; break; case UIDeviceBatteryStateUnplugged: // 放电中 state = 2; break; case UIDeviceBatteryStateFull: // 充满 state = 4; break; default: state = 0; break; } if (battery_level < 0.0f) { return @"-1,0"; } NSString *result = [NSString stringWithFormat:@"%.0f,%d", battery_level * 100, state]; return result; }
|
这里约定返回 电量百分比,状态码:0 未知、1 充电中、2 未接电源/放电中、4 已充满。Android 侧应转换成相同约定后再交给 Cocos 端,而不是直接混用 Android 与 iOS 的原生枚举值。
相关阅读