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的实现方式,比如微信可以导入微信联系人到通讯录中,这时候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);
}

References

⚠️ **GitHub.com Fallback** ⚠️