有感于Android Calendar开发

Android虽然看起来很火,但是API可以说还不是很完善,变化大,有些功能还暂时木有提供。
比如Calendar相关的接口,目前还不够稳定,所以还没有对外开放,在模拟器上都还没有CalendarProvider和Calendar,虽然可以想尽办法给他安装上去,但还是有些问题。
前段时间为了开发基于Calendar的第三方应用重新编译了Calendar加入到android.jar,后来进行了一半没有这样做了,干脆直接自己写,虽然也是照着Calendar和CalendarProvider源码抄过来。

由于开放的原因,目前设备制造商是各自为政来定制自己的Calendar应用,比如Moto Milestone就必须要在登录Google账户的前提下才能使用Calendar,HTC、Samsung以及Huawei等等都有了一个自己内置的账户,所以他们把Calendar建立在自己的内置账户上,手机不用登录Google账户也可以使用Calendar,这样基于Calendar的第三方应用就格外难实现,又要不损坏原有系统的数据,保持原有功能能用,又要基于原有系统的数据开发自己的功能。

目前在参考了另外一些应用的实现之后,算是对这些情况有些了解了,等开发完成再整理再来完整的分析下。

Google Voice对中国用户开放了

不知是今天还是昨天,发现Gmail当中弹出了一个Call的提示信息框,翻译出来的意思就是说2011年用Gmail Call对美国和加拿大打电话免费,对其他地方打电话享受极大的折扣价格,what’s out,这不就是Google Voice吗?以前不对中国的用户开放,注册的时候还找代理什么的来完成,现在居然对中国用户开放了。这也算是一大消息吧。于是今天中午吃完饭想来试试看,看看是不是假的,愚人节还没有到吧。刚好目前在美帝国的一个同学在QQ上出现了,问他要了个电话,拨了过去(他接通了,但是在公司没有耳机和麦,所以测试不出来通话效果),但是这足以证明这个东西对中国人开放了,而且没有受到无敌防火墙的拦截。在国内打其他的电话价格是0.02$每分钟,换算过来还是很划算的,还可以发短信,感兴趣的可以试试。
如图
google-voice-open-up-to-china

这是Android联系人头像的bug吗

经过BASE64编码之后的图片字符串(点此下载,测试源码当中也有),在Java SE环境下可以解码出来生成一张图片,但是通过代码插入到Android联系人头像就无法显示出来(显示的一张白色图片,非Android Contacts原生的占位符头像),用SQLITE MAN查看插入图像后的数据库BLOB字段,显示“File content cannot be displayed”
目前还没有解决办法,测试了很多图片,有的图片有时候能显示,有时候不能显示,这是Android的bug吗?

插入图片的源码如下:

	private void doInsert(String imageStr) {
		ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
		int rawContactInsertIndex = ops.size();

		ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
				.withValue(RawContacts.ACCOUNT_TYPE, null).withValue(
						RawContacts.ACCOUNT_NAME, null).withValue(
						RawContacts.AGGREGATION_MODE,
						RawContacts.AGGREGATION_MODE_DISABLED).build());

		ContentProviderOperation photoOp = ContentProviderOperation.newInsert(
				Data.CONTENT_URI).withValueBackReference(Data.RAW_CONTACT_ID,
				rawContactInsertIndex).withValues(
				getPhotoCV(B64.decode(imageStr))).build();
		ops.add(photoOp);

		try {
			getApplicationContext().getContentResolver().applyBatch(
					ContactsContract.AUTHORITY, ops);
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (OperationApplicationException e) {
			e.printStackTrace();
		}
	}

	private ContentValues getPhotoCV(byte[] photo) {
		ContentValues cv = new ContentValues();
		cv.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE);
		cv.put(Photo.PHOTO, photo);
		return cv;
	}

完整测试源码下载http://hb.good.gd/?FileId=1062335

一些有用的 Linux 命令

1、快速查找你曾经执行过哪些命令
相信

ps -ef | grep ssh

被很多人熟悉
试着改变下

history | grep ssh

看看效果

2、搜索文本文件内容

grep -i menu_deleteContact ~/dev/src/Contacts/src/com/android/contacts/*

3、对某个文件夹下的所有符合条件的文件进行操作

for i in `find $SRC_FOLDER/ -name "*.cpp" -o -name "*.h"`; do cpplint.py $i; done

这里就是找出$SRC_FOLDER文件夹下所有cpp和h的文件,并对每个文件执行cpplint检查

4、查看网卡实时流量,绝对好用

bwm-ng