android 关机闹钟 android开发教程

  次阅读 作者:智能小宝 来源:互联网 2015-09-29 10:00 我要评论(0)

新项目的手机需要实现关机状态下的闹钟,早在刚开始接触 android 的时候都在想为什么 android 不支持关机状态下的一些功能呢?像充电或者闹钟什么的,虽然每个平台的驱动不一样但上层应用是可以提供统一接口的呀,果然在 4.0 的时候支持关机充电了,关机闹钟仍然不在默认支持中。市场上的很多品牌手机也都不支持这个功能,让很多用惯了 Feature Phone 以及担心辐射的用户都不习惯。这次做关机闹钟在一些思路上借鉴了关机充电的实现方法。

整体思路如下:

在 uboot 中通过 PMU 判断开机的原因,如果是 RTC 模块使能开机则在 uboot 中传递启动参数 androidboot.mode=alarm,然后在 init 进程中判断启动模式(当前系统有 3 种启动模式:normal、charger、alarm),如果是 alarm 模式则启动 alarm 服务,alarm 服务与应用程序 alarm关联,因此需要编写应用程序来实现关机闹钟的功能。应用程序主要实现以下几个个方面的功能:1、显示关机闹钟的 UI 以及当前时间;2、播放闹铃;3、读取 input 事件判断用户操作;4、用户可以在 UI 中选择懒人模式、开机或者关机。下面逐个解析这几个功能的实现:

1、UI

在 zygote 没有启动之前完成 UI 显示可以参考 charger 的做法,用 android 的 minui 接口,这些接口实现了图形的描绘以及固定大小的文字显示,函数介绍如下:

[cpp]

int gr_init(void);/* 初始化图形显示,主要是打开设备、分配内存、初始化一些参数 */

void gr_exit(void);/* 注销图形显示,关闭设备并释放内存 */

int gr_fb_width(void);/* 获取屏幕的宽度 */

int gr_fb_height(void);/* 获取屏幕的高度 */

gr_pixel *gr_fb_data(void);/* 获取显示数据缓存的地址 */

void gr_flip(void);/* 刷新显示内容 */

void gr_fb_blank(bool blank);/* 清屏 */

void gr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a);/* 设置字体颜色 */

void gr_fill(int x, int y, int w, int h);/* 填充矩形区域,参数分别代表起始坐标、矩形区域大小 */

int gr_text(int x, int y, const char *s);/* 显示字符串 */

int gr_measure(const char *s);/* 获取字符串在默认字库中占用的像素长度 */

void gr_font_size(int *x, int *y);/* 获取当前字库一个字符所占的长宽 */

void gr_blit(gr_surface source, int sx, int sy, int w, int h, int dx, int dy);/* 填充由source指定的图片 */

unsigned int gr_get_width(gr_surface surface);/* 获取图片宽度 */

unsigned int gr_get_height(gr_surface surface);/* 获取图片高度 */

/* 根据图片创建显示资源数据,name为图片在mk文件指定的相对路径 */

int res_create_surface(const char* name, gr_surface* pSurface);

void res_free_surface(gr_surface surface);/* 释放资源数据 */

图片只支持 png 格式,做这个 UI 的图片资源花了不少时间(没做过美工),一般图片的显示先由 res_create_surface 创建资源数据,然后调用 gr_blit 填充,最后调用 gr_flip 刷新显示。在关机闹钟的界面还需要显示当前时间,最开始调用 minui 默认的字库来显示,但是默认字库的字体太小了,只支持 10 x 18 ASIC-II 编码的字符,效果很不好,后来就把时间需要的 10 个数字以及符号以图片的形式显示。

2、闹铃

在这个阶段播放闹铃只能选择 tinyplay,tinyplay 是 android 自带的一款简易播放器,只能播放固定格式的 wav 文件。UI 显示以及播放闹铃分别独占一个线程,以保证各自不被干扰。

3、input evnt

当闹钟开始响后,用户可以通过触摸屏点击选择是否开关机或者进入懒人模式,这里就需要对用户操作做出判断,即在程序中去读取 /dev/input 下面设备的数据。当进入懒人模式后会停止闹铃 5 分钟再响,这个阶段需要关闭 lcd 和 触摸屏,用户可以通过按键唤醒 lcd。input event 是在进程去循环读取并处理的,示例代码如下:

[cpp]

static int event_loop(void)

{

int i;

int ret = 0;

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...