Get all contacts who have mobile phone numbers
For querying all the contacts, you can query the RawContacts.CONTENT_URI directly. For getting all the phone numbers, you can query the RawContactsEntity.CONTENT_URI. For getting exact contact with the fixed phone number, you can query from PhoneLookup filter URI.
But if you only want to get all the contacts who have mobile phone numbers, usually you will need to query all the mobile phone numbers, and filter that to remove duplicate contacts (some contacts may have more than 1 mobile phone number). Or you can query all the contacts, and filter that to remove the contacts who have no mobile phone numbers.
Here’s my code that work:
private void test() { Cursor c = getContentResolver().query(RawContacts.CONTENT_URI, new String[]{"_id"}, "contact_id in (select raw_contact_id from data where mimetype_id=5" +" AND data2="+CommonDataKinds.Phone.TYPE_MOBILE +" )" , null, null); while (c.moveToNext()) { Log.e("Evan",c.getString(0)); } c.close(); }
I think putting “distinct(_id)” in the column strings should also work, and it’s easier.
近期开发小结
Maemo平台:
持续改进MSCIM。4月底5月初时N900在香港台湾上市,中文输入使用的是基于MSCIM的蒙恬输入法。
所以Nokia台湾和蒙恬的人都有和我联系,关于一些bug的。
MSCIM为蒙恬修改恢复了若干快捷键,以使蒙恬的面板可以调用显示输入法选择菜单。同时明确延续SCIM的LGPL版权声明,以使蒙恬不需要开源其输入法模块。
同时因为有俄语用户反映俄语状态不能切输入法(因为俄语输入是不显示输入法面板的吧,所以点不了选择输入法的按钮),就加了shift+ctrl组合键进行输入法切换。
新引入mscim-chewing新酷音模块。当然这个还很不完善,另外,因为我也不会这输入法。。估计改进是有困难了
从Ubuntu source上取了ttf-wqy-microhei的包,推进maemo extras-devel源了,用来替换里面的ttf-droid。Droid字体不全,文泉驿的微米黑就是在Droid字体上完善的。
另外看起来,仿照蒙恬的软键盘形式,在MSCIM上用helper做软键盘也是可行的,只是开发工作量颇大,并且因为早期就禁用掉了inline输入模式,用大键盘的话,会遮挡掉文字输入框,看起来应该也不爽。用小键盘,可能意义就小很多了。
Android:
主要在研究Android Sync Framework。往深处做,Android还是有不少问题的。加入自己的Sync Account时,有supportsUploading选项。一般对于social network client就设成false,比如facebook什么的,这样其实相当于只读,就是把服务器上的好友加载到本地而已。但如果系统中只要有任意一个启用的支持supportsUploading的account的话,新增联系人时就完全不可能新增到你这个account名下,这对于想做同步的程序是不可行的。但如果把supportsUploading设为true呢,那其实问题就更大了,新增联系人时,如果选择建在这个account下,出来的EditContact的界面是只有选择头像和输入人名的框的,其它所有的比如填电话邮件这些的控件全部不会显示。
所以Funambol出的Android syncml client用了很直接了当的做法,自己做了个自己的EditContact的界面,只是每次新建联系人时,系统都会问你用哪个activity,这个观感不好。
而Google Accounts和Exchange Server Account为什么能用呢?因为那是把两个package name写进了Contacts应用程序的。实际上从代码上来看,Google有在考虑为ExternalSource进行这些编辑控件的加载,但至少到2.1版本还是不可用的。
所以,如果不改Contacts程序的code的话,你是做不了一个完善的类似Google联系人同步这样的程序的。
Android用NDK和整套源码下编译JNI的不同
前些天要写个jni程序,因为才几行代码,想着用NDK开发可能容易些,就先研究了下。不过最终我的代码虽然只有几行,但需要libdl,因为用到了dlopen一类的函数,只能又换到用android源码体系下编译。
不过两个都用了下,就发现了些不同。我其实并不能确定这些是不是实际存在的差异的,我只是拿NDK的sample和我见到的android源码里的jni代码做的比较
1. NDK支持的库很少,所以用以前最好先看看自己需要的功能是不是已经包括了,省得白忙活。不过人家是有解释的,说NDK里有的库才是稳定的,其它的建议你不要用。嗯,google总是这一套说辞,不公开的API也是。至于要看android源码中多了哪些库,make modules后grep一下lib开头的应该就是了,不过也不是所有都能用啦。
2. 注册函数的方法是不同的。举例说,我在com/evan129/jnitest/JniUtils.java有个native int foo()方法,需要在jni中实现
在NDK中,你只要实现这个函数,然后函数名是以jint Java_com_evan129_jnitest_JniUtils_foo(JNIEnv* env, jobject thiz) 命名既可。也就是说,如果你的jni只要实现这个函数,并且功能也很简单的话,那么你的jni c/cpp文件里只需要这一个函数就完事了。
但在android源码中编译jni代码是不同的,jni中的函数名无所谓。不过你至少还需要加一个
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)方法,这个方法你可以找个现有的复制一把就行,检查运行环境的。然后主要是这个方法中会调用(*env).RegisterNatives函数,在这里把jni中的方法和java文件中的方法关联起来。
看起来像是NDK自动补上了这部分工作,我并不清楚原理啦。
3. 有个很诡异的区别,自动传入的JNIEnv* env好像不是一个东西。因为在android源码中使用这个env一般是如env->NewStringUTF(…),而NDK中sample里的一处是(*env)->NewStringUTF(…) 这env和*env差很大吧。但两处函数传入的都是JNIEnv* env,我只能怀疑JNIEnv的定义是不是都是不同的。
末了,就是说下我这个很简单的jni折腾了我两天的一个问题。如前所说,我是用android源码来编译的,自己在packages/app/下建了PinyinJNI工程,下面有个jni目录,每次直接用mmm packages/app/PinyinJNI/jni来编译。jni目录下的Android.mk中指定的名字是这样的LOCAL_MODULE := libpinyin 每次编译都很顺利,生成了libpinyin.so。但是我在java文件里,System.loadLibrary(“libpinyin”)总是失败。感谢paranoia@newsmth帮我解决了这个问题,告诉我在loadLibrary时用”pinyin”。但是,这个事情实在太奇怪了,那文件名是libpinyin.so啊,而且我在这里用/data/data/…/libpinyin.so这种完整路径也会失败,我以前虽然没写过JNI,但调用过,用完整路径指定jni so文件应该不会有问题的。或者,从另一个角度想,如果我LOCAL_MODULE的名字不是用lib开头的,那它调用时应该用什么名字?这个”lib”前缀又是哪步删除的?我没有多做测试了,但是猜想NDK中应该是没有这种诡异的问题的。
Android代码里都出现OCR库了
Orz..最近几天更新好多啊
昨天更新了一把,donut分支上的全局搜索已经可用了,虽然和预想中一样的弱,联系人只能搜人名,还是不能搜短信,目前试了下能搜的也只有应用程序名和网页历史记录
临睡前更新了一把,发现donut分支没什么变化,master分支出现了一个巨大的包,本地展开后356M。。我还以为更新kernel呢
在external/tesseract,这个包在donut分支上没有看到。看了下说明,是个OCR的库
This package contains the Tesseract Open Source OCR Engine.
This code is a raw OCR engine. It has NO PAGE LAYOUT ANALYSIS, NO OUTPUT
FORMATTING, and NO UI. It can only process an image of a single column
and create text from it. It can detect fixed pitch vs proportional text.
Having said that, in 1995, this engine was in the top 3 in terms of character
accuracy, and it compiles and runs on both Linux and Windows.
As of 2.0, Tesseract is fully unicode (UTF-8) enabled, and can recognize 6
languages “out of the box.” Code and documentation is provided for the brave
to train in other languages. See code.google.com/p/tesseract-ocr for more
information on training.
不知道google想在android上做什么软件,是说以后拿着gphone可以去图书馆拍书了么?XD
Android donut分支更新了
RSS源跟了engadget英文站,看到的消息。原文链接 内有一张截图。不过那也是转载xda-forum上的帖子啦,第60楼帖子有更多截图
据已经试用的人说,有以下一结明显的可以看到感觉到的更新:
multitouch 多点触摸支持
gestures 手势支持(这个原来就有,估计是改进吧)
cdma 就是以前只支持GSM+WCDMA而已,以后可以有CDMA的机器了,虽然我也没兴趣吧
search integrated into everything 就是那个全局搜索
wpa enterprise 不知道这个WPA说的是不是WIFI加密的那个。。
vpn support VPN支持
automated backups 自动备份
tons of performance tweaking 大量性能调整。话说他们用模拟器的,也能感觉出来么?
Read more
上些HTC A6161 (Magic)和Dopod A6188的图
对比的文章再说吧,写评测不是我的专长。不过,摄像也不是我的专长,拍得不好,请见谅。听我们同事说,这只Dopod A6188是国内正式出售的第一只机器哦。
首先是包装的不同,HTC Magic的包装更像iPhone一些,比较小巧,Dopod的还是华丽点儿啊
Read more
Hero rom初体验
在入G2之前,就看到有Hero for G1的rom了。看过下截图,不是喜欢的配色,所以一直也没有想尝试。今天总算有机会试了一把。网上能找到的,像xda上的,好像都是for Vodfone Magic的,我还是折腾了会儿,才成功刷到我的A6161上,呵呵。比对了下,似乎Vodfone版和这个A6161,主要就两处不同,用的boot.img不同,wifi驱动不同。一直不知道怎么把已有boot.img解开再修改,我只好用G2 rom中的boot.img去替换Hero rom里的。试了几次,好歹还是成功的。
Read more
试用四个Android twitter client有感
今天又出了门,去逛了商场,一定要记下来,以作为证据备查。于是想到要推到twitter上去
之前只用过一款,当时在Android market上搜的,叫Twitta,评价还不错。试了下,看着像网页版的,反正UI风格很诡异,和Android本身很不相符,但至少满足基本需求。
今天开始这个程序一登录后,就有异常,直接崩溃。我只好想着另找个试试
首先,我试了直接网页打开twitter,被自动定向到wap版,但是Android浏览器不支持wap/wml页面,显示了源码。
还试了以下三款,
Twitli,这东西至少默认设置下是不支持中文的,菜单项一大堆,反正粗看了一分钟,我还没找到地方设置。这还算了。我竟然都没找到发推文的地方-_- 另外,也没有登出,注销的地方,不知道这东西是不是会自己一直跑后台
Droid Twitter 登录界面还不错,还带个广告条,让我认为应该是某个不错的收费软件的带广告免费版吧。登录一看,只有一个输入框发自己的新推,看不到历史,更别说follow的别人的消息了。还强制横屏。。
还有个就叫twitter的,最终这个还算work,只是,它是个网页版的东西。程序里放了个WebView
所以,如果您要用的话,我建议试试看Twitta,要是你的帐号不死机,那这个还算可以。
结论是,Android Market上的免费软件都是些什么玩意儿啊。。 还没试过收费区的。还不如都出些做得好的收费软件,我再去找破解呢。不打算在这上面浪费时间了
补充:评论区推荐的Twidroid软件也不错,推荐一下
Howto change the startup animation of Android OS
The statup animation means the one you see before the launcher application comes out.
It was a line with a red point goes from left to right again and again before, in Android 1.0. Currently, on cupcake, it’s a text string, “ANDROID”, with shine goes from left to right.
I found someone add an advertisement logo to that animation in a customized rom. So I studied how to remove that, or make a new one by myself.
Finally, I found it out. There are 2 pictures under frameworks/base/core/res/assets/images:
android-logo-mask.png
android-logo-shine.png
The 1st one is the background. Then, you can edit it with picture editor, like add your own name on it.
Well, after edited it, you need to build framework-res out, with command “make framework-res”. Then, you will get a new framework-res.apk. But usually, you can not use this file to replace the one in the rom/firmware for real devices, like G1, G2. Since, some resources are not under the same version.
What I do is pull out the original framework-res.apk from the rom. Unzip both this framework-res.apk and the one I made by myself. Replace the 2 pictures under assests/images with the one I made before. Notice, you can not replace the files with the PNG files you edited, but not compiled.
Then zip out framework-res.apk again, and sign with SignApk tool. Now you can use the new framework-res.apk to replace the original one.
