Android 内容解析器返回在移动设备中激活的所有帐户 否

Posted

技术标签:

【中文标题】Android 内容解析器返回在移动设备中激活的所有帐户 否【英文标题】:Android Content resolver Returns all accounts activated in mobile No 【发布时间】:2016-02-07 22:08:08 【问题描述】:

在尝试使用以下代码从 android 检索联系人列表时,它会返回多个帐户,例如 google/gmail、whatsapp 和 soma(激活的帐户数量取决于内容解析器为那么多的联系人副本返回的数字!) . 请帮我删除它。

 cursor1=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI ,null, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME +" ASC");              
 startManagingCursor(cursor1);
String[] from = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone._ID,; 
  int[] to = android.R.id.text1, android.R.id.text2; 
listadapter = new SimpleCursorAdapter(getBaseContext(), android.R.layout.simple_list_item_2, cursor1, from, to);        
 setListAdapter(listadapter);

【问题讨论】:

【参考方案1】:

Simpy 试试下面的代码,它有更多的验证,并检查它是否有电话号码。但是你的andorid设备的联系人应该安排好。

   private void displayContacts() 

      ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
                null, null, null, null);
        if (cur.getCount() > 0) 
            while (cur.moveToNext()) 
                  String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                  String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                  if (Integer.parseInt(cur.getString(
                        cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
                     Cursor pCur = cr.query(
                               ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                               null,
                               ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
                               new String[]id, null);
                     while (pCur.moveToNext()) 
                         String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                         Toast.makeText(NativeContentProvider.this, "Name: " + name + ", Phone No: " + phoneNo, Toast.LENGTH_SHORT).show();
                     
                    pCur.close();
                
            
        
    

您还可以在此处对帐户进行一些过滤,例如通过使用以下代码从电话联系人中获取应用程序联系人来过滤掉应用程序帐户:

Cursor c = getContentResolver().query(
        RawContacts.CONTENT_URI,
        new String[]  RawContacts.CONTACT_ID, RawContacts.DISPLAY_NAME_PRIMARY ,
        RawContacts.ACCOUNT_TYPE + "= ?",
        new String[]  "com.whatsapp" ,
        null);

ArrayList<String> myWhatsappContacts = new ArrayList<String>();
int contactNameColumn = c.getColumnIndex(RawContacts.DISPLAY_NAME_PRIMARY);
while (c.moveToNext())

    // You can also read RawContacts.CONTACT_ID to read the
    // ContactsContract.Contacts table or any of the other related ones.
    myWhatsappContacts.add(c.getString(contactNameColumn));

【讨论】:

它会显示重复,因为它们在您的电话联系人提供商中是重复的,但是如果它们是具有相同名称的合并(加入)帐户,则不会有相同名称的重复值,所有帐户将被视为相同。 已经合并了!!!但还是没办法,伙计,我手机中的联系人列表看起来很好,没有重复,imo之类的应用程序只显示一个联系人,我只想要这样的解决方案:( 然后获取与您的联系人ID相同的单个号码,即使对于您的每种类型的帐户也是唯一的。 我的荣幸,这对使用有帮助吗? 当然,我已经添加了一些代码,任何方式都竖起大拇指;)

以上是关于Android 内容解析器返回在移动设备中激活的所有帐户 否的主要内容,如果未能解决你的问题,请参考以下文章

一个简单的监控木马分析

Apollo 订阅解析器永远不会激活?

激活设备管理器权限,防止被卸载

激活设备管理器权限,防止被卸载

移动设备交互应用 实验一 熟悉Android编程开发环境

Android 的 FusedLocationApi 不激活 GPS 并返回非常旧的日期