Android Contacts - cllu/.rc GitHub Wiki
主要记录一下Android中的Contacts系统。
数据库是存在/data/data/com.android.providers.contacts/databases/contacts2.db
文件中。可以adb拷贝出来,也可以直接adb shell里用sqlite3打开查看。
$ adb -d root
$ adb -d pull /data/data/com.android.providers.contacts/databases/contacts2.db ./
表的数量很多,但我们关心的就是这样几个表:
-
accounts
: 这个表存了可以写入raw_contacts的account,比如我登陆了我的Google账号和Google+,以及微信账号,这个表里就存了这三个账号的信息。 -
raw_contacts
: 提供Contacts的Account们写入的表,都有一个account_id表明是谁写入的。 -
contacts
: 几个raw_contacts
可能指的是同一个人,这个表就是合并之后的联系人表。 -
data
: 这个表是存email、phone之类具体信息的,这里面有raw_contact_id
指向raw_contact
表。
我比较关心的是通讯录中Connections的实现方式,比如微信可以导入微信联系人到通讯录中,这时候Connections中有微信一栏,目前支持“发送消息、免费语音通话、查看朋友圈”这几项,点击可以直接去到微信相应的页面。这部分没搜到相应的文档,只能去啃源代码的实现,安卓通讯录的源码在Google Code上,在com.android.contacts.detail.ContactDetailFragment
中
// Handle showing custom rows
entry.intent = new Intent(Intent.ACTION_VIEW);
entry.intent.setDataAndType(entry.uri, entry.mimetype);
这局就应该是关键啦,mimetype可以翻微信的AndroidManifest.xml文件看,还是比较明显的。
<activity android:name="com.tencent.mm.plugin.accountsync.ui.ContactsSyncUI" android:configChanges="keyboardHidden|orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.tencent.mm.login.ACTION_LOGIN" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/vnd.com.tencent.mm.login" />
<data android:mimeType="vnd.android.cursor.item/vnd.com.tencent.mm.chatting.profile" />
<data android:mimeType="vnd.android.cursor.item/vnd.com.tencent.mm.chatting.voip" />
<data android:mimeType="vnd.android.cursor.item/vnd.com.tencent.mm.chatting.voip.video" />
<data android:mimeType="vnd.android.cursor.item/vnd.com.tencent.mm.plugin.sns.timeline" />
<data android:mimeType="vnd.android.cursor.item/vnd.com.tencent.mm.chatting.phonenum" />
</intent-filter>
</activity>
剩下那个uri是啥?
entry.id = item.getId();
entry.uri = ContentUris.withAppendedId(Data.CONTENT_URI, entry.id);
DateItem的getId定义在这里
public long getId() {
return mContentValues.getAsLong(Data._ID);
}