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

2024-04-29

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

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

我读过谷歌文档 http://developer.android.com/reference/android/provider/ContactsContract.html that 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 http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html

来源_ID
读/写
唯一标识该行到其源帐户的字符串。通常,它是在插入原始触点时设置的,之后不会更改。一个值得注意的例外是新的原始联系人:它将有一个帐户名称和类型(可能还有一个数据集),但没有源 ID。这向同步适配器表明需要在服务器端创建一个新联系人,并将其 ID 存储在电话上相应的 SOURCE_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);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在android中识别本地电话联系人和SYNC电话联系人? 的相关文章

随机推荐

  • Facebook 从应用程序选项卡获取用户 ID

    Facebook 应用程序可以有一个选项卡 用户可以根据需要将其添加到其个人资料的选项卡中 我如何获取 uid 或以其他方式识别当前登录的用户以便为他自定义布局 谢谢 如前所述here http developers facebook co
  • 使用 Loggly 时在 log4net 中指定应用程序名称

    我正在测试几个 ASP NET Web 应用程序 并使用 Log4net 的附加程序通过 Loggly 设置它们 现在 日志记录似乎没问题 但我似乎找不到一种方法 使用 log4 loggly 附加程序 来指定应用程序名称 以便当我在 Lo
  • 如何列出运行时函数的所有调用?

    有什么办法可以list 在VS中显示 写入文件 所有来电者 对象 函数 一个函数的当程序运行时 可能使用调试器 我需要record 所有通话 包括来电者 一个函数的从计划启动到终止 简单扫描源代码或二进制文件不做这份工作因为该程序可以作为服
  • 如何用VB.net生成pdf文件?

    我想生成一个非常简单的报告 其中包含一些图像和文本 我想知道是否有一种方法可以使用 vb net 生成 pdf 文件 您可以使用 Visual Studio 附带的 Crystal Reports 对象导出到 PDF 文件
  • Java 切片数组与 Python 中一样

    我有一个 Java 字节数组 需要获取其中的一部分 我想以与使用 Python 列表相同的方式使用 Java 数组 即使用切片 Java中有类似的东西吗 先感谢您 您可以使用数组 https docs oracle com en java
  • Tkinter:为按钮和标签制作“类”

    因此 我在 tkinter 框架中几乎有许多不同的按钮和标签 并且我都希望它们具有相似的属性 假设我希望它们全部具有红色前景色 并具有透明背景 我什至可以这样做吗 这个透明背景仅适用于按钮 我可不可以有一个class对于按钮 我认为这是在
  • match_none 有什么用?

    我浏览了docs https www elastic co guide en elasticsearch reference current query dsl match all query html query dsl match no
  • UML三元关联实现java代码[重复]

    这个问题在这里已经有答案了 三元关联是结构关系 指定一个事物的对象连接到其他两个事物的对象 我理解这种关系 但我不知道如何实现显示这三个类之间关联的方法 让我们考虑下面的例子 项目有许多使用特定编程的开发人员 语言促进发展 开发人员使用特定
  • 使用酶测试反应确认窗口

    我在 React 中有一个按钮 当用户单击它时 它会打开一个简单的确认窗口 在我添加confirm方法之前 下面的测试是绿色的 添加后确认它是红色的 我需要如何更改测试才能与附加确认一起使用 反应删除按钮 const DeleteButto
  • Django 的 TEMPLATE_DEBUG 设置有什么用?

    我一直在尝试查找有关此设置的信息 但信息不多 有人可以解释一下这个设置是什么吗 我应该在生产中关闭它吗 只是想了解它 也许我错过了 django 中的一些重要内容 我使用django 1 6 此设置有助于调试渲染模板时引发的错误 异常 如果
  • 使用 HornetQ (JBoss) 在 docker 容器上公开的 JMS 所需的端口

    我正在使用 Docker 将 JMS 服务器容器链接到另一个 JMS 客户端容器 但是当我在docker容器中运行服务器时 客户端无法正确连接到服务器 我在docker上暴露了端口443 JMS还有其他使用的端口吗 我可以成功创建目标 但不
  • pybtex 是否支持 .bib 文件中的重音/特殊字符?

    from pybtex database input import bibtex parser bibtex Parser bibdata parser parse file sample bib 上面的代码片段在解析 bib 文件时效果非
  • 如何在Delphi 7中监听麦克风并检测声音响度

    我需要一个程序来捕获麦克风输入声音超过特定阈值时的事件 那么我可能需要不断地听麦克风 并以某种方式测量声音幅度 Delphi 7 中可以这样做吗 我建议您使用低音音频库 http www un4seen com bass html http
  • 如何用 DefaultErrorHandler 替换已弃用的 SeekToCurrentErrorHandler (spring-kafka)?

    我正在尝试找到一种方法来使用新的 DefaultErrorHandler 而不是 spring kafka 2 8 1 中已弃用的 SeekToCurrentErrorHandler 以便在出现错误时覆盖重试默认行为 我想 停止 重试过程
  • 类型 '' 不能用作泛型类型或方法中的类型参数 'T'

    我创建了这个通用方法 public IEnumerable
  • python 文档字符串中的这些标签 @ivar @param 和 @type 是什么?

    ampoule 项目在文档字符串中使用一些标签 例如 javadoc 标签 例如来自pool py http bazaar launchpad net dialtone ampoule main annotate 26 file id po
  • WCF:App.config 中的配置比自定义代理类中的硬编码更好吗?

    首先this https stackoverflow com q 6761105 5593152不重复 我有一个有点不同的问题 删除客户端 或跨平台项目中的客户端 App config 文件中的 WCF 配置并将其替换为注入的配置是一个好习
  • 如何基于现有镜像创建新的docker镜像?

    我刚刚开始使用docker 我使用 docker 文件创建图像 如何从现有图像创建新图像 假设你有一个容器bd91ca3ca3c8正在运行 并且您希望在容器中进行更改后创建一个新映像 生成另一个图像将允许您保留您的更改 在这种情况下你可以运
  • SQL Azure 迁移向导 - 需要额外的小步骤吗?

    我最近使用 CodePlex 的 3 7 迁移向导将几个 SQL 2008 数据库迁移到 Azure 完成迁移后 一切正常 除了我在 Management Studio 中没有所有 正常 右键菜单项 例如我没有 设计 选择前 1000 名
  • 如何在android中识别本地电话联系人和SYNC电话联系人?

    任何人都可以指导我找到以下问题的解决方案 我必须确定电话联系人是保存在本地还是来自电子邮件 以编程方式 我读过谷歌文档 http developer android com reference android provider Contac