Tagged with android

Android 2.2终于开放了推送的消息服务

内流满面阿,终于不用自己搞个长连接了。

2.2释放出来了,在其新特性中,有一点:Cloud to Device Messag(C2DM),这个跟gtalk类似,可以让web程序或者app engine向手机发送消息,不同的是gtalk是系统级别的,一般程序访问不了,这个则是标准的API。

在旧版本android上实现这个功能还是蛮麻烦的,我原来写过。主要的思路就是自己起一个gtalk的客户端,用xmpp协议,然后放在service保证长时间运行。缺点很明显:这个service消耗手机资源,功能跟系统本身服务重复。不过在消息服务没有开放时,自己的app是接收不到xmpp消息的。

google开放出来很直接,因为使用的还是老一套。下面是手机受到消息时的log,可以看出使用的还是smack,当然,协议还是xmpp了。

05-22 09:26:13.356: DEBUG/GTalkService(223): [ChatMgr] processPacket: not logged in! drop org.jivesoftware.smack.packet.DataMessage@43e929e8
05-22 09:26:13.576: INFO/JumpNote_SyncAdapter(298): Beginning full sync for account fkpwolf@gmail.com
05-22 09:26:16.316: INFO/JumpNote_SyncAdapter(298): Sync complete, setting last sync time to 1274491573563

那么web端或者云端如何发送消息呢?我看到代码里面是访问https://android.clients.google.com/c2dm/send,大概用的是rest吧。不过现在google要申请帐号才能访问这个服务。mobile收消息则使用标准的receiver模式。

Google给了个例子:JumpNote,可以看作双向同步功能的写字板。技术用android client + app engine + gwt(web client),使用了android新的sync API,还是一个蛮复杂的例子,因为这不单单是一个mobile app,而是一个完整的云服务实例,值得仔细研究研究。

device

Tagged

修改Android的自带程序:“屏幕锁” - 加上联通标志

我的机器是G1 + 联通WCDMA + Android 1.6 (Donut)。在原来用移动卡的时候,屏幕锁上有运营商(carrier)的标志,换成联通的卡后没有这个标志(可能是sim卡里面信息不全的缘故),光光的很是煞风景。这里说说下我修改的漫长过程。

0.check out 代码

这里要checkout出donut的代码,目前google源上已经有比这个更新的版本2.1,所以不能直接拿来用,否则我想机器启动会有问题,毕竟屏幕锁是系统第一个界面。

repo init -u git://android.git.kernel.org/platform/manifest.git -b donut

如果原来用的是master也没关系,repo sync时不会重新checkout所有的代码,所以会很快。然后进入项目framework/policy/base,运行命令git describe可以查看当前版本,git tag察看所有tag,可以用git checkout donut会只签出当前project的代码(很奇怪,donut这个HEAD不在git tag里面,git水很深啊)

1.修改Java代码。

研究了源代码后,我发现如果用修改配置或者扩展类的方法是改不了这个标志的,因为很多类在初始化时就定义了hard coding了type,扩展已有类是行不通的。于是就直接修改界面代码吧,这样也简单明了。定位framework/policy/base/phone下面的LockScreen.java,

    private void refreshSimOkHeaders(CharSequence plmn, CharSequence spn) {
        final IccCard.State simState = mUpdateMonitor.getSimState();
        if (simState == IccCard.State.READY) {
            if (plmn != null && !TextUtils.isEmpty(plmn)) {
                mHeaderSimOk1.setVisibility(View.VISIBLE);
                mHeaderSimOk1.setText(plmn);
            } else {
                mHeaderSimOk1.setVisibility(View.GONE);
            }

            if (spn != null && !TextUtils.isEmpty(spn)) {
                mHeaderSimOk2.setVisibility(View.VISIBLE);
                mHeaderSimOk2.setText(spn);
            } else {
                //mHeaderSimOk2.setVisibility(View.GONE);
                mHeaderSimOk2.setVisibility(View.VISIBLE);
                mHeaderSimOk2.setText("China Unicom");
            }

最后3行是我修改的,hard coding就没啥好说的了。关于plmn和spn的区别,看这里

2. 编译

make android.policy

这里只编译这个项目,会得到一个android.policy.jar。

遇到‘convert_endian’ undeclared (first use in this function)的错误看这里,error: cast from ‘char*’ to ‘int’ loses precision的错误看这里。个人感觉新版本代码编译错误更少。

另:我倒是想过直接修改android.policy.jar里面的classes.dex,比如先反编译,修改后直接再编译回去。不过网上找了几个工具,效果都不是很好。不清楚是dex反编译现在不成熟还是Google对dex保护太好。

3.模拟机上测试

为了保险起见(我可就这个手机),现在emulator上运行看看。本来想直接修改sdk带的system.img省事,后来发现用mkyaffs2image生成image不能用:模拟器起不来。算了,后来我是老老实实用make snod重新生成system.img。

4.上传到真机

这又是一个很烦琐的过程:mount /system让它可写(步骤见这里),adb push(先adb pull 备份,保险…),然后,如果你跟我一样遇到Failed to copy: Permission denied.和Cross-device link的问题,一定要参考这个贴子,不要自己折腾了。最后chmod 644 android.policy.jar,恢复文件原来的属性。

5.重启

没啥问题,看来我是太小心了。看到结果后感觉也很一般,这个过程太折腾了,可能会又更好的办法吧,我是对git和make一点不熟,出了问题只能google。还好有点收获…休息去了,我的周末…

device

Tagged ,