请选择 进入手机版 | 继续访问电脑版

12360技术网 - 专业IT技术发表平台

 立即注册  找回密码
查看: 2881|回复: 6

CocosCreator之KUOKUO带你搞反射-获取电池信息

[复制链接]

21

主题

25

帖子

157

积分

注册会员

Rank: 2

积分
157
发表于 2020-1-27 14:35:36 | 显示全部楼层 |阅读模式
摘要

在使用 CocosCreator 打包的原生应用中,我们可以通过引擎封装好的反射机制调用 Java 的静态方法,从而实现提示、相册、支付跳转等功能。本次内容为利用 jsb 读取返回的电池信息。
正文

先看效果


版本说明


  • CocosCreator 为 2.2.1 版本。
  • AndroidStudio 为 3.5.2 版本。
  • JDK 为 13 版本。(具体:13.0.1)
  • NDK 为 20 版本。(具体:20.1.5948944)
  • SDK 安装了 API 23 的。
  • 模拟器为 AVD。(可以在 AndroidStudio 内安装)
布局与脚本

在 CocosCreator 中布局好文本和电池图片,如图。(电池由一个背景和十个矩形图片组合而成)

电池信息的显示

通过布局组件,让十个表示电量的电池块均匀摆放,然后写一个通过个数控制的方法。
  1. /** * 10个格子,显示几个 * @param fillIndex */updateBatteryShowStateByCount (showCount: number) {    const array = this.powers.children    array.forEach((ele, index) => {        if (index < showCount) {            ele.opacity = 255        } else {            ele.opacity = 0        }    })}
复制代码
这样我们就能根据传入的 0 - 10 来控制显示。但是,电量应该是 0 - 100 的,我们应该再封装一层。
  1. // this.powerCount 表示电量 0 - 100// this.v 表示电池电压,单位是 mV// this.batteryState 表示电池状态,充电还是放电// 根据数据调整电量格子显示updateBatteryShowState () {    const n = Math.floor(this.powerCount / 10)    this.updateBatteryShowStateByCount(n)}// 根据数据显示于 Label 组件updateInfoShow () {    const labs = this.infoMgr.getComponentsInChildren(cc.Label)    labs[0].string = `${this.powerCount}%`    labs[1].string = this.batteryState    labs[2].string = this.v + "毫伏(mV)"}
复制代码
约定信息格式

显示我们都做好了,然后我们获取电池信息后怎么传回来呢?cocos 反射方法有整数、小数、字符串和空值这几个类型,那么我们可以选择小数、整数和字符串。为了方便,我决定将小数、整数都拼接成字符串传过来,到了 cocos 再解析一下。
  1. // 约定格式 xx,xx,xx,xx 然后用 split(",") 进行切割getElect () {    const className = "org/cocos2dx/javascript/AppActivity"    const info = jsb.reflection.callStaticMethod(className, "getElect", "()Ljava/lang/String;")    if (!info) {        cc.log("jsb get null")        return    }    const array = info.split(",")    const level = parseInt(array[0])    const scale = parseInt(array[1])    const status = array[2]    const voltage = parseInt(array[3])    this.powerCount = (level * 100) / scale    this.batteryState = status    this.v = voltage    // 数据赋值完毕后刷新电池格数与 Label 显示    this.updateAll()}
复制代码
那么我们多长时间取一次信息呢?因为电池信息的获取不需要那么频繁,1秒左右都可以,我这里定为 2 秒。
  1. update (dt: number) {    this.timeTemp += dt    if (this.timeTemp > 2) {        this.timeTemp = 0        this.getElect()    }}
复制代码
Java获取信息

在 Android Studio 中如何获取电池电量呢?贼简单!
  1. public static String getElect() {    // 参数:电池信息改变时    IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);    Intent receiver = app.registerReceiver(null, filter);    // 利用 getIntExtra 获取信息    int level = receiver.getIntExtra("level", 0);    //获取当前电量    int scale = receiver.getIntExtra("scale", 0);    //获取总电量    int status = receiver.getIntExtra("status", 0);  //获取充电状态    int voltage = receiver.getIntExtra("voltage", 0);//获取电压(mv)    // 电池状态    String batteryStatus = "";    switch (status) {        case BatteryManager.BATTERY_STATUS_UNKNOWN:            batteryStatus = "[没有安装电池]";            break;        case BatteryManager.BATTERY_STATUS_CHARGING:            batteryStatus = "[正在充电]";            break;        case BatteryManager.BATTERY_STATUS_FULL:            batteryStatus = "[已经充满]";            break;        case BatteryManager.BATTERY_STATUS_DISCHARGING:            batteryStatus = "[放电中]";            break;        case BatteryManager.BATTERY_STATUS_NOT_CHARGING:            batteryStatus = "[未充电]";            break;        default:            batteryStatus = "[未知状态]";            break;    }    // 将信息拼接成 xx,xx,xx,xx 的形式    StringBuilder info = new StringBuilder();    info.append(level);    info.append(",");    info.append(scale);    info.append(",");    info.append(batteryStatus);    info.append(",");    info.append(voltage);    return info.toString();}
复制代码
对了,app 这个变量是这么来的:
  1. protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    if (!isTaskRoot()) {        return;    }    SDKWrapper.getInstance().init(this);    // 这里,记得先声明 private static AppActivity app = null;    app = this;}
复制代码
真机测试


结语

有意思吧!学会了没?
O(∩_∩)O~~
微信公众号


                                                                                                                                       
                                                    
  • 点赞                        
  • 收藏                        
  • 分享                                                                                                                        
  •                                                         
                                      
    • 文章举报                           
                                                
                                                                        
                                            
                                                        KUOKUO众享                                                                发布了121 篇原创文章 · 获赞 134 · 访问量 15万+                                                                                            私信                                                            关注
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x




上一篇:前端=>js=>cookie(js)
下一篇:C语言&mdash;&mdash;求n天后的日期
回复

使用道具 举报

0

主题

18

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
发表于 2020-2-3 17:51:42 | 显示全部楼层
楼主发贴辛苦了,谢谢楼主分享![www.12360.co]
回复

使用道具 举报

0

主题

11

帖子

241

积分

中级会员

Rank: 3Rank: 3

积分
241
发表于 2020-2-4 07:13:21 | 显示全部楼层
我看不错噢 谢谢楼主![www.12360.co]
回复

使用道具 举报

0

主题

11

帖子

241

积分

中级会员

Rank: 3Rank: 3

积分
241
发表于 2020-2-6 05:06:53 | 显示全部楼层
楼主太厉害了!楼主,I*老*虎*U![www.12360.co]
回复

使用道具 举报

0

主题

11

帖子

241

积分

中级会员

Rank: 3Rank: 3

积分
241
发表于 2020-2-8 00:37:14 | 显示全部楼层
楼主,大恩不言谢了![www.12360.co]
回复

使用道具 举报

0

主题

15

帖子

325

积分

中级会员

Rank: 3Rank: 3

积分
325
发表于 2020-2-11 00:42:16 | 显示全部楼层
这个帖子不回对不起自己![www.12360.co]
回复

使用道具 举报

0

主题

10

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 6 天前 | 显示全部楼层
楼主,我太崇拜你了![www.12360.co]
社区不能没有像楼主这样的人才啊!
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

12360技术网

GMT+8, 2020-2-22 12:20 , Processed in 0.095515 second(s), 41 queries .

本网站内容收集于互联网,Www.12360.Co不承担任何由于内容的合法性及健康性所引起的争议和法律责任。 欢迎大家对网站内容侵犯版权等不合法和不健康行为进行监督和举报。

© 2019-2020 Www.12360.Co

快速回复 返回顶部 返回列表