Monthly Archives: December 2012

新浪微博Android客户端实战 – Timeline

很久不更新了,博主快成太监了,适逢放假,继续写。

前段时间,陈华的唱吧火得一塌糊涂,也一直在用,最近才发现他们用了新浪微博客户端 sso 方式登录,原来新浪更新了SDK,代码托管从 code.google.com 移到 github。之前民间版本有Yusuke Yamamoto 写的 weibo4android,一些客户端版本也选择了在这基础上开发。都说,选择比努力更重要,我们还是选择官方的版本,因为他们专职做这些事情,能提供持续的更新的。

SDK 的使用,查看官网的pdf 文档,解释很清楚,依葫芦画瓢,我们拿到accessToken后,就好办事了。新版的API,全部使用interface,用C/C++的话来说,就是回调,相比上一个版本,使用AsyncTask显得很蹩脚。timeline 的实现,使用ListView控件,可以考虑使用下拉自动刷新组建Android-PullToRefresh android pull to refresh 基本满足要求,但需要滚动到底部也能显示“正在加载”,不怕做不到,就怕想不到,还真有人把这个给做好了, android-pulltorefresh-and-loadmore。这个组建运行在 ICS 滚动有问题,需要更新同步到 android-pulltorefresh 的 PullToRefreshListView.java。

ListView有图片需要加载,缓存,解决性能问题等,还是很麻烦的,可以使用 LazyListcwac-thumbnail等组建。为了尽快的看到结果,这里暂时使用 Andrid Query 的 image函数,使用方便。隆重介绍 Android Query,web工程师应该都知道jQuery,那么AQuery不言而喻了,写很少的代码,完成更多的功能。效果图:
weibo timeline

关于json 解析

一般有三种,Android内嵌的解析器,jackson,gson。从性能与文件大小考虑,这里使用gson。

关于分页

分页时传入page参数即可?非也!很容易理解,假设第一次取20条,第二次(page=2)再取20条,而这个过程,有插入的数据怎么办?这样是不准确的,应该是使用sinceId, maxId 这两个参数。请求大于sinceId是最新纪录,低于maxId 的是下一页(加载更多)。

内容格式化

包括:友好的时间展示,表情转义,话题(##之间),@,url等。一般使用正则表达式。

本篇代码: https://github.com/lytsing/weibo/blob/master/weibo/src/org/lytsing/android/weibo/ui/TimelineActivity.java

Hack c8812e

媳妇上周入手这款手机,主要研究Android 的UI,她们公司要做客户端。感觉很行,最不爽的,是一大堆定制软件,看着都烦,有些软件可以在软件管理卸载掉,有些需要root,/cust/chinatelecom/cn/app 目录下的OEM app,大都可以删掉。照着这个帖子 《华为C8812E刷机解锁ROOT教程(附带ROM下载地址)》,基本可以搞定。

很郁闷的是,

$ adb devices
List of devices attached 
????????????	device

有一串问号,以为是驱动连不上,试了 adb shell 居然可以进入,原来它就是这样!还有更变态的:

$ adb logcat
info: log device is empty!

关闭了log,解决方法:
http://stackoverflow.com/questions/6941710/unable-to-open-log-device-dev-log-main-no-such-file-or-directory

Dial this: *#*#2846579#*#*
Service menu will appear.
Go to “ProjectMenu” -> “Background Setting” -> “Log Setting”

Open “Log switch” and set it to ON.
Open “Log level setting” and set the log level you wish.

Reboot the phone.

有了root,那么限制你的,只有你的想象力了。删除的apk路径在:

/system/app
/system/delapp
/data/cust/app
/data/cust/delapp
/cust/chinatelecom/cn/app
/cust/chinatelecom/cn/delapp

上面的路径含有 delapp 的,是在管理软件里手动卸载后,在相应的 delapp 目录保存一份。删除之前,要清楚知道你在干什么,如果误删了,只得重新刷机。

想装上谷歌应用包 gapps,到 http://wiki.cyanogenmod.org/wiki/Latest_Version/Google_Apps 找最新的20121128 gapps 包,90多M,手机的 /system 分区没那么多空间,删掉没用的应用,还是不够,最后选用 gapps-ics-20120422-signed,50M.

$ adb remout
$ cd ~/Downloads/gapps-ics-20120422-signed
$ adb push system/ /system

上图:c8812e install google apps

如果误删了某个软件,怎么办?可以到华为官方下载ROM, 使用 split_updata.pl 打开 UPDATE.APP,提取 system.img。

$ perl split_updata.pl UPDATE.APP
Extracted output/file01.mbn
Extracted output/file02.mbn
Extracted output/boot_versions.txt
Extracted output/file04.mbn
Extracted output/file05.mbn
Extracted output/upgradable_versions.txt
Extracted output/file07.mbn
Extracted output/file08.mbn
Extracted output/file09.mbn
Extracted output/version.txt
Extracted output/file11.mbn
Extracted output/appsboothd.mbn
Extracted output/appsboot.mbn
Extracted output/file14.mbn
Extracted output/boot.img
Extracted output/file16.mbn
Extracted output/system.img
Extracted output/file18.mbn
Extracted output/userdata.img
Extracted output/file20.mbn
Extracted output/file21.mbn
Extracted output/recovery.img
Extracted output/file23.mbn
Extracted output/splash.raw565
Extracted output/file25.mbn

deli@deli-ThinkPad-T42:~/a/output$ du -sh *.img
382M boot.img
4.0K recovery.img
189M system.img
3.7M userdata.img

但发现 C8812的官方包解包后的boot.img实际上是system.img,system.img实际上是userdata.img,有点变态。boot.img 是 ext4格式,这个好办:

$ file boot.img
boot.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (needs journal recovery) (extents) (large files)
$ mkdir e
$ sudo mount -t ext4 -o loop boot.img e

$ cd e/
$ ls
app build.prop delapp fonts lib ts.conf usr wifi
bin cdrom etc framework media tts vendor xbin

取你所取。