android - 如何在android中识别本地电话联系人和SYNC电话联系人?

标签 android contacts

任何人都可以指导我找到以下问题的解决方案。

  1. 我必须确定电话联系人是保存在本地还是来自电子邮件?(以编程方式)

我已经阅读了google doc ContactsContract.Groups,其中包含有关原始联系人组(例如 Gmail 联系人组)的信息。当前的 API 不支持跨多个帐户的组概念。

基于此,我尝试了以下代码。

 StringBuffer output = new StringBuffer();
   final String[] GROUP_PROJECTION = new String[] {
            ContactsContract.Groups._ID, 
            ContactsContract.Groups.TITLE,
            ContactsContract.Groups.SUMMARY_WITH_PHONES
            };

Cursor c =  getContentResolver().query(
ContactsContract.Groups.CONTENT_URI, GROUP_PROJECTION, null,
        null, ContactsContract.Groups.TITLE);

  int IDX_ID = c.getColumnIndex(ContactsContract.Groups._ID);
  int IDX_TITLE = c.getColumnIndex(ContactsContract.Groups.TITLE);
  output.append("title"+IDX_TITLE+"\n");
    Map<String,GroupInfo> m = new HashMap<String, GroupInfo>();

while (c.moveToNext()) {
    output.append("test...\n");
    GroupInfo g = new GroupInfo();
    g.id = c.getString(IDX_ID);
    g.title = c.getString(IDX_TITLE);
    output.append("title"+c.getString(IDX_TITLE)+"\n");
    int users = c.getInt(c.getColumnIndex(ContactsContract.Groups.SUMMARY_WITH_PHONES));
    if (users>0) {
        // group with duplicate name?
        GroupInfo g2 = m.get(g.title);
        if (g2==null) {
            m.put(g.title, g);
            output.append("title"+g.title+"\n");
            groups.add(g);
        } else {
            g2.id+=","+g.id;
        }
    }
}
outputText.setText(output);
c.close();

但没有希望。

最佳答案

我发布此答案以供将来使用。我们可以使用名为 RawContacts.SOURCE_ID

的字段来区分本地电话联系人和同步联系人

描述here

SOURCE_ID
读/写
将此行唯一标识到其源帐户的字符串。通常它是在插入原始触点时设置的,之后永远不会改变。一个值得注意的异常(exception)是新的原始联系人:它将有一个帐户名称和类型(可能还有一个数据集),但没有源 ID。这向同步适配器表明需要在服务器端创建一个新联系人,并将其 ID 存储在手机上相应的 SOURCE_ID 字段中。

示例代码如下,同步联系人id为id,其他为null。

private void testContact() {
        StringBuffer output = new StringBuffer();
        ContentResolver resolver = getContentResolver();
        Cursor contacts = resolver.query(Contacts.CONTENT_URI, null,
                Contacts.HAS_PHONE_NUMBER + " != 0", null, Contacts._ID
                        + " ASC");
        Cursor data = resolver.query(Data.CONTENT_URI, null, Data.MIMETYPE
                + "=? OR " + Data.MIMETYPE + "=?", new String[]{
                Email.CONTENT_ITEM_TYPE, Phone.CONTENT_ITEM_TYPE},
                Data.CONTACT_ID + " ASC");

        int idIndex = contacts.getColumnIndexOrThrow(Contacts._ID);
        int nameIndex = contacts.getColumnIndexOrThrow(Contacts.DISPLAY_NAME);
        int cidIndex = data.getColumnIndexOrThrow(Data.CONTACT_ID);
        int data1Index = data.getColumnIndexOrThrow(Data.DATA1);
        boolean hasData = data.moveToNext();

        while (contacts.moveToNext()) {
            long id = contacts.getLong(idIndex);
            Uri rawContactUri = 
                      ContentUris.withAppendedId(RawContacts.CONTENT_URI, id);

                    Uri entityUri =
                      Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY);

                    Cursor c =
                      getContentResolver().query(
                        entityUri,
                        new String[] {
                                  RawContacts.ACCOUNT_NAME,
                          RawContacts.SOURCE_ID, Entity.DATA_ID, Entity.MIMETYPE, Entity.DATA1},
                        null, null, null);

                    try {
                         while (c.moveToNext()) {
                             String sourceId = c.getString(0);
                             if (!c.isNull(1)) {

                                 String source_id = c.getString(1);
                             try {
                                     output.append(c.getString(4)+sourceId+" "+source_id+"\n");

                                     //output.append(datas+ "Sync1 "+  c.getString(4)+" Sync2 "+  c.getString(5)+" Sync3"+  c.getString(6)+" Sync4 "+  c.getString(7)+"\n");
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                                 //decide here based on mimeType, see comment later
                             }
                         }
                    } finally {
                         c.close();
                    }

        }

        outputText.setText(output);
    }

关于android - 如何在android中识别本地电话联系人和SYNC电话联系人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26671407/

相关文章:

android - Android 的代码覆盖率 (calabash-android BDD)

java - Android SignalR 应该作为 Service 还是 IntentService 来实现?

android - 通过 Intent 转到联系人中的某个联系人

android - 如何在android中获取联系电话?

Java 反射 - 找不到 Android 类

java - Android 多点触控图像查看延迟

android - 线性渐变在移动网络浏览器中不起作用

android - 无法使用 ContentProviderOperation 删除整个联系人

swift - 如何将电话号码返回到 swift 应用程序?

使用 Loader 的 Android 联系人电话号码无效列 data1