Posts tagged ‘android’

Android内核开发的几个便捷命令

在android源码的根目录下执行:

. build/envsetup.sh

可以获得下列非常方便的命令:

croot:   Changes directory to the top of the tree.
m:       Makes from the top of the tree.
mm:      Builds all of the modules in the current directory.
mmm:     Builds all of the modules in the supplied directories.
cgrep:   Greps on all local C/C++ files.
jgrep:   Greps on all local Java files.
resgrep: Greps on all local res/*.xml files.
godir:   Go to the directory containing a file.

当我第一次获知它们的时候,内流满面啊……

用“help”命令可以获知更多……

Android 2.2 (Froyo) 中文联系人拼音检索增强补丁

Froyo终于开始官方支持在任何系统语言下都能把中文联系人按照拼音顺序排序,并且支持全拼和简拼(可以从名字中间任意一字的拼音开始)检索。这要感谢一位叫Bai Tao的工程师。

不过,google的改进有一点不如我以前的补丁,只是很小的一点,就是用“gdg”可以搜索到“郭德纲”,而“gdgang”不行。gdgang这种简全混合的模式在同一简拼的联系人较多的时候,只要比纯简拼多敲1-2个字符,就能让检索的结果好很多。比如“gdga”可以过滤掉郭得乖、国大贵、关定格等等。

下面这个补丁,就补全了这个功能:

--- a/src/com/android/providers/contacts/ContactLocaleUtils.java
+++ b/src/com/android/providers/contacts/ContactLocaleUtils.java
@@ -102,7 +102,13 @@ public class ContactLocaleUtils {
                 final Token token = tokens.get(i);
                 if (Token.PINYIN == token.type) {
                     keyPinyin.insert(0, token.target);
-                    keyInitial.insert(0, token.target.charAt(0));
+                    if (i == tokenCount - 1) {
+                        // Use all characters of the last token
+                        keyInitial.insert(0, token.target);
+                    } else {
+                        // Use the first character of other tokens
+                        keyInitial.insert(0, token.target.charAt(0));
+                    }
                 } else if (Token.LATIN == token.type) {
                     // Avoid adding space at the end of String.
                     if (keyPinyin.length() > 0) {
@@ -112,7 +118,13 @@ public class ContactLocaleUtils {
                         keyOrignal.insert(0, ' ');
                     }
                     keyPinyin.insert(0, token.source);
-                    keyInitial.insert(0, token.source.charAt(0));
+                    if (i == tokenCount - 1) {
+                        // Use all characters of the last token
+                        keyInitial.insert(0, token.source);
+                    } else {
+                        // Use the first character of other tokens
+                        keyInitial.insert(0, token.source.charAt(0));
+                    }
                 }
                 keyOrignal.insert(0, token.source);
                 keys.add(keyOrignal.toString());

我已经编译好一个,安装方法如下:

  1. 下载ContactsProvider.apk,通过adb、Root Explorer等覆盖Android系统的/system/app/下的同名文件;或者下载pyin-patch-froyo-0.1.zip,用刷rom的方法刷一下。
  2. 更改两次系统的语言(比如:中文->英文->中文),并且更改后等一小会儿,让系统在后台刷新联系人检索关键词数据库。
  3. 搞定!

以上内容在CM 6.0 RC3 for G1测试通过。理论上说,只要是2.2的Rom应该都能用,除非厂商自己在ContactsProvider里动了手脚。

欢迎反馈使用情况。如果比较多人喜欢这个,可以考虑提交给google……

中文排序补丁 for Android 2.1 (Eclair)

image

  • 只有排序(包括联系人、应用程序等),没有检索
  • 无论系统语言设成什么,中文都是按照拼音排序。
  • 在CM 5.0.7/5.0.8上测试通过。其它Eclair的rom应该也能用。

下载地址:http://sunner.cn/pinyin-patch-sorting-only-eclair.zip

和任何Rom的安装方法一样,到Recovery模式下安装。安装后,需要清空一下联系人数据,再重新同步联系人,才能生效。清空方法:Settings->Application->Manage Applications->Menu Filter->All->Contacts Storage->Clear data

做开发的朋友可能用得到这个文件

Android 2.1 (Eclair)的中文联系人拼音检索(App方案)

上一篇文章谈了从修改android入手解决拼音检索的方案。刚才路上又想起了我最早做这件事时想的app方案。Eclair使app可以方便地实现这个功能。有两种策略:

  1. 无root情况,可以从name生成各种检索词,存入nickname,如果允许app写nickname的话
  2. 有root,可以直接操作contacts2.db,把检索词写入

除了中文,还可以用同样的方式去支持很多种语言,还可以靠缩写吸引拉丁语系的用户,群体很大。收费高级版提供周期自动更新检索词的功能,免费版必须手工运行才更新,同时显示广告。

app只有一个不能逾越的问题,就是做不到实时更新,这也是我当初最终选择改android的原因。不过,其实没有几个人刚加了联系人,就去搜索之,所以实时的意义并不大。

思路就是这样,谁有兴趣谁就玩吧,让我免费用收费版就行。

Android 2.1 (Eclair)的中文联系人拼音检索问题

Rainux早上留言说,CM的5.0.7开始支持G1了,而且速度很快。这让我又痒痒了。看了眼xda,现在还是test1,得等等才能用。为了用的时候马上就能爽,于是又跑进eclair的代码里,寻找拼音检索的解决方案。

折腾了一天,得出的结论是:

  1. Eclair已经可以用email地址中@前的字符,以及nickname(编辑联系人时点more可以添加多个nickname)检索联系人;
  2. 所以,我认为结合email、nickname和中文输入法检索,挺方便了。补丁有些不必要了。

如果有朋友还是想要拼音检索,我这里提供一些经验和思路,感兴趣的可以自己弄。

/data/data/com.android.providers.contacts/databases/contacts2.db是联系人数据库文件。其中表name_lookup保存所有的检索关键词,data_id和raw_contact_id分别对应data和raw_contact表。normalized_name就是检索关键词,以sortkey的16进制形式保存。name_type数值的含义定义在packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsDatabaseHelper.java中的NameLookupType类里。normalized_name多增加几行数据,就多几个关键词。

packages/providers/ContactsProvider/src/com/android/providers/contacts/NameNormalizer.java下定义的NameNormalizer::normalize(String name),是所有(至少我看到的都是)检索关键词入库前都要经过的一道处理。其实在这里把中文都转成拼音,就能实现拼音检索,但这样中文检索就没有了,而且不能实现简拼。

packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsProvider2.java下定义的StructuredNameRowHandler类,当姓名发生添加/变化时,该类都会被触发。如果在这里自动根据姓名生成若干全拼、简拼字串,然后把这些字串都添加到name_lookup里(调用insertNameLookupForStructuredName()就行),就可以实现拼音检索,而且不影响中文检索。这也许是最容易做到的了。但是不是肯定能实现,得实验才知道。

现在没兴趣(如果有人送我个N1,没准我就会有兴趣了,^_^)继续弄下去了,感兴趣的继续吧。

Android 中文联系人拼音排序及检索补丁3.5版 for Android 2.1/eclair (测试版)

下载地址:

http://sunner.cn/pinyin-patch-eclair-beta.zip

由于本人没有装eclair,所以不能测试。有谁在用,就帮忙测试看看吧。

“云”中行:云计算带给我的出行体验

人类还只能在地面活动的时候,就有了飞行的梦想。欧美人的梦想,是骑着扫帚;阿拉伯人的梦想,是坐着飞毯;中国人的梦想,是腾云驾雾。今天看来,中国人的梦想不仅具有浪漫情怀,而且相当具有前瞻性。此次从哈尔滨再次拜访武汉,一路上无不依赖“云”的能力,恰如腾云驾雾一般,只不过这个云是“云计算”的云。凭借这朵无处不在的云,此行顺畅而又惬意,让人不得不撰文一篇,和大家分享这次“云中行”。

第0天

出行日期早已确定,两个月前就在http://www.csair.com订好了往返机票,算下来是3.8折,和火车票几乎相当。网上支付后,惊奇地发现可以直接选座位,于是就选了前排靠过道的位置,这样能早些下飞机。

要参加的会议在香格里拉大饭店开。这种地方是断然不能住的,于是上Google地图搜索武汉香格里拉,再在附近搜索“快捷酒店”,找到了相距500米的一家如家宾馆。这里最适合我了。大约两星期前,在携程预定好了房间,有免费宽带,不含早餐,正和我意。

今天开始出行准备。先到飞友网订制了两个航班的动态短信,顺便也给家里领导订了一份儿。虽然她可以通过Google Latitude随时掌握我的行踪,但飞机上还不能上网,所以借飞友的短信报报动态还是能彰显我的忠诚的。

搜到了武汉机场的网站,点击一次就查到了机场大巴的信息(在google地图直接搜机场到宾馆的公共交通方案失败,估计是机场大巴路线还没有被收录)。我最佳的下大巴的站点,是新华路客运站,距离宾馆只有2公里的直线距离。将此地点存入我的地图,查找了一下从这里步行到宾馆的路线,必须绕道,2.9公里。把地图模式换成卫星图,发现直线连接两个地点,中间要经过一大片楼区和一个宝岛公园。楼区里肯定有路的,只不过地图上没有标注。遂决定到时依仗我的G1手机,hiking一下。

住和行都确定好,就要想怎么吃和玩了。以前去武汉,没有大片时间玩。这次因为错误理解了会议通知中的时间,所以幸运地拥有一个整天可以逛逛。先到wikipedia上找到了武汉的条目,确定以户部巷和吉庆街为主要的食堂,武汉大学和湖北省博物馆为主要游乐场。这些地点都存入了我的地图,以备随时从手机中取用。

中午时,飞友和携程都发来短信告诉我武汉的天气。

下午,到南航网站办理了登机手续,这样明天就不用太早去机场了。

晚上,根据Google Tasks上随手记录的必带物品,一件件地打包。这些物品都是我平时偶尔想起来,分别从手机或计算机输入的。

第1天

手机上日历的闹铃叫醒了我。行程中主要的事件早就存入了Google Calendar,并分别设好了提前多久提醒我。所有设定都自动在手机上生效。

坐上机场大巴,在漫长的地面行程中用手机回了几个Email,浏览了一遍Google Reader。到达机场后,在自助值机终端刷了一下身份证,登机牌自动打印出来。

因为时间安排得比较精确,所以在候机厅没等一会儿,就登机了。然后,就是手机关机,飞机起飞。于是我便与计算的云短暂分离,一头扎入真正的云的怀抱。

坐我旁边的女士居然是我一个好朋友的同学,我们还一起参加过那个朋友的婚礼。聊天话题从该买什么样的笔记本进入到是否可以在网上买笔记本,进而是我向她介绍网上购物的生活乐趣。于此云中谈彼云,看来只靠管机是无法逃离那朵云了。

飞机降落,开机。Android桌面上的天气预报启动切换了城市:武汉,有雾。抬头看看天,雾还真不算小。

又上了大巴,又是回email,又是看Reader,还回了两条gtalk。

下了大巴,路边见到了我第二想念的武汉美食:鸭脖子。但很恐怖,我知道的两大鸭脖子品牌:精武和周黑鸭居然每种都并排好几家,每家的店名都稍有不同,但关键字精武和周黑鸭必有一个。为了知道哪家正宗,我掏出G1,打开浏览器,搜!!!一分钟后,心满意足地拿着两根鸡脖子向宾馆进发了。

打开了Google Maps,在基站和GPS的共同作用下,很快就定位成功。最新版的Google Maps还发挥了电子罗盘的功能,让我随时掌握面对的方向在地图上是哪边。打开我的地图,之前在PC上标注的信息点立刻显现。调整好方向,出发了。

这一路走得颇有趣。为了少走路,我穿过了一个颇有平民风味的楼群,两个免门票的公园,少吸了很多尾气。如果没有Google Maps的卫星图,我是不可能找到这些可爱的只能步行的小路的。

到了宾馆,报上姓名,递上身份证和信用卡,确认在携程网上的选择,房卡就拿到了。

在房间里修整一番,用我的上网本接上宾馆的宽带,通过RDP顺畅连入我在办公室的桌面。不过速度有些慢,于是我就用本地的浏览器处理了email、OS课程等等事情。然后,就肚子饿了。

拿出手机,运行Place Directory,搜索附近的饭店,看看名字,看看简介,看看点评,没发现有兴趣的。又打开了大众点评网的Andoroid客户端,限定只列出附近的“湖北菜”,效果好多了。根据人均消费和网友评价,圈定了“越秀酒家”,以它为点,在地图上规划了香格里拉踩点->越秀吃饭->穿越中山公园->武汉广场驻足->地铁一号线->江汉路步行街->吉庆街大排档,最后打的回府的路线。

于是出发,一路上当然免不了随时用Maps指明方向。点菜时,大众点评网的推荐菜成为首选。

晚上回到宾馆,car从云的那一端又是gtalk又是wave地发来一堆学院布置的任务,打破了我明天一日游的美梦。我恨这躲不开、吹不散的云啊!

第2天

今天上午的主题是美食、历史和节能减排。下午的主题是——工作。

为了保护地球,我决定今天只乘坐公交车。武汉三镇确实不是一般的大,很难找到直达公交车。但没有关系,Google Maps可以帮我计算出最佳的公交换乘方案。所以我轻松地到达了户部巷,吃上了我第一想念的热干面;轻松地走到黄鹤楼,并绕圈寻找最佳的拍摄地点未果;鬼使神差地走到了辛亥革命纪念馆的门口,随手用Goggles拍了门口的孙中山先生雕像,随后就被Goggles返回的精确结果折服了;然后又轻松地坐上到湖北省博物馆的直达车,亲眼免费目睹了越王勾践剑,为它的寒光而震撼;最后把目的地设为香格里拉,Maps给出的完美1次换乘方案,使我只步行了300米就抵达了会议报到地点。

报到时需要提供论文ID。掏出手机,启动gmail,搜索“Paper ID”,所得即所搜。

下午很忙,但很有趣。和Car一起做的工作是在Google Wave上协作完成的。边讨论,边修改,虽然中间隔着黄河(差几公里就隔着长江了),但比面对面一起使用Word写同一份文档要顺畅得多。中间偷闲到顺丰快递的网站下了个订单,不到半小时快递员就上门收件,把一个不方便在飞机上携带的物品邮寄回家。

晚饭又选了附近的一个特色餐馆。手机上的Weather Channel说一小时后会下雨,于是带着伞出行。回程时,伞真的派上用处了。

晚上和家里领导同时看《天天向上》,中间通过gtalk语音连接,可以一起笑,一起叫,随时讨论,好像就在身边,紧紧靠在一起。

第3天

今天会议正式开始。香格里拉的会场里wifi信号非常好,而且还免费,很大气。但参会的人除了我就没有几个用笔记本的,都在很认真地听。其实用笔记本并不代表不认真听,我用它随时查查不认识的单词、缩写,查查presentation里提到的系统、文章等等,还可以在遇到没兴趣的paper时,干会儿自己的工作。记得美国那次IEEE的会,参会者比这次少很多,但在会场使用笔记本的要多很多。这几天一直在想,如果学生上课时面前都有一个连上了网的笔记本,会给课程带来什么?我听过的美国课程,至少1/3的学生在用;电影《Knowing》里,尼古拉斯·凯奇扮演的MIT教授在上课时,所有学生面前都是一台笔记本;美国普渡大学开发了专门的软件鼓励学生在上课时通过网络和教师互动。很多时候,我们对待新生事物是粗野的,只要看到它有一点点负面作用,就完全忽视其正面意义,开始封杀。禁止大一学生买电脑是这样,禁止个人申请域名是这样,耗巨资搭建GFW也是这样。这其实就是一种因循守旧。

会议的欢迎晚宴上,同桌的人少不了要聊武汉哪里好吃,哪里好玩。本来我不想“炫耀”我的手机,但看到他们时间有限而人生地不熟,所以还是拿出G1,帮他们规划路线。信息就在指尖,云深方知何处。

晚上查询了一下昨天发出的快件,已经到北京了。估计会比我早到家。顺手用email订阅了快件状态信息。

第4天

今天上午最后一个做presentation的教授直接上网,在浏览器里演示他的工作(一个数学公式自动评分的系统,及它相关的工具),我在下面也跟着操作了两下,感觉非常好。

午饭后,距离计划奔赴机场的时间还有2个多小时。房间已经退掉,没有可以待的地方,于是决定购物,买点儿土特产什么的。又使用Places Directory,轻松发现了500米外的家乐福。

现在,我正坐在机场登机口旁边的一个咖啡厅里,用10元钱换得一听可乐和wifi密码。从飞友网查询到前序航班准点起飞,所以大约半小时后我就可以登机了。

感谢云计算送我这次完美的旅行。希望飞机落地后,就能在手机上看到到一堆comments,:-)

Android中文联系人拼音排序及检索补丁3.5版 for Android 1.6/donut

下载地址:http://sunner.cn/pinyin-patch-v3.5-donut.zip

注意:此版本可能只能在CyanogenMod的donut系列rom上使用,并且刷了cm rom后,至少要重启一次,才能再用本补丁。

和刷任何rom的方法都相同。第一次启动时,会在运营商画面停的时间比较长,此时正在重建数据库,系正常现象。

关于本补丁的功能,请阅读Android中文联系人拼音排序及检索补丁3.5版 for Android 1.5

Android钟表的品牌

android桌面

android桌面

Android桌面的钟表widget是有品牌的,一直看不清是“maimo”还是“malmo”。代码树里的原图也看不准确。今早经过一番搜索,已经可以确认,是“malmo”。

http://www.googleandblog.com/g1-phone-tips/说道:

Malmo is the Swedish city where the G1 Graphic User Interface (GUI) Design company The Astonishing Tribe (TAT) is based.

Android中文联系人拼音排序及检索补丁3.5版 for Android 1.5(0623更新)

donut/1.6用户请到这里下载

更新记录:

  • 2009-06-23:在zixia的帮助下,发现了处理长姓名的bug。现在安全和稳定性更好了。下载3.5版
  • 2009-05-03:稍微加快了一点点速度。提供了更灵活的方式,可以支持多种固件和recovery,详见下面的安装方法。下载3.43版
  • 2009-05-02:第二次更新,可以支持更广泛的甚至未来的固件。但对recovery有要求。目前在JF v1.43的recovery上测试通过。下载3.42版
  • 2009-05-02:支持直接输入中文检索。在原版ADP 1.5和JF ADP 1.5测试通过。下载3.41版
  • 2009-05-01:开始支持Android 1.5下载3.4版

主要功能:

  • 联系人按拼音排序
  • 用中文、全拼、简拼、简拼混合全拼和email地址检索联系人

安装方法:

  • 和刷固件的方法一样(建议使用JF的recovry程序)
  • 安装后如果无效,就进命令行先运行命令“su”。使用T-Mobile固件的,运行命令“/data/patch/uptm.sh”;使用其它固件的运行命令“/data/patch/up.sh”

劳动节,要劳动,而且要做公益劳动!

http://sunner.cn/pinyin-patch-v3.41.zip

在我的ADP 1.5原版上测试通过。一切功能照旧,使用方法照旧,只是支持1.5了。1.0版(也就是RC33、RC9等)的用户请继续使用3.21版的补丁。

原理上没有任何变化,补丁代码也没有一行变化,就是重新在1.5下编译了一下。有的目标文件甚至大小都没有变化。只有icudt38l.dat文件跟着1.5做了一个极其微小的调整。整体来说,应该比把之前的补丁直接用到1.5上稳定一些(心理层面)。

从cupcake的代码看,对日文方方面面的支持已经近乎完备了,不仅能日文排序,还能日文检索,还能按日本习惯分割电话号码……按照日文实现的思路和路线(比如在联系人数据库里增加了一个字段phonetic_name),很快也就能实现中文的类似功能。不过不知道谷歌中国、中国移动和来弄我这些android先驱们在干啥,源码树里一行这样的代码都还没有呢。