【问题标题】:Fetch Contacts in android application在android应用程序中获取联系人
【发布时间】:2012-02-05 19:02:56
【问题描述】:

我正在关注这些链接以获取我的应用程序中的联系人

How to call Android contacts list?

http://www.higherpass.com/Android/Tutorials/Working-With-Android-Contacts/

我可以在手机上显示联系人列表,但是

-

  1. 我想在每个联系人处添加一个复选框,以便用户可以选择 多个联系人,并通过单击完成按钮,他应该能够 得到所有 他选择的联系人

  2. 我还想获取联系人的姓名和电话 联系电话号码,见我的代码:

if (resultCode == Activity.RESULT_OK) { Uri contactData = data.getData(); 光标 c = managedQuery(contactData, null, null, null, null); 如果(c.moveToFirst()){ 字符串名称 = c.getString(c .getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); 字符串编号 = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER)); Log.v("name", name +" "+number); // TODO 对选中的联系人你想做什么 // 姓名。 } }

在 log cat 上它显示输出为:

01-09 12:46:41.688: V/name(699): Xyz 1

那是联系人的名字是 xyz,它至少有 1 个与之关联的电话号码。请帮助我如何获取与该联系人关联的号码。

编辑:

如果我在代码中使用这个(String number = c.getString(c.getColumnIndexOrThrow(People.NUMBER));) 行,我会得到以下异常:

01-09 13:33:23.008: E/AndroidRuntime(786): FATAL EXCEPTION: main
01-09 13:33:23.008: E/AndroidRuntime(786): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.contacts/contacts/lookup/0r1-2C2E30/1 (has extras) }} to activity {sra.com/sra.com.ContactsDemo}: java.lang.IllegalArgumentException: column 'number' does not exist
01-09 13:33:23.008: E/AndroidRuntime(786):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3515)
01-09 13:33:23.008: E/AndroidRuntime(786):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557)
01-09 13:33:23.008: E/AndroidRuntime(786):  at android.app.ActivityThread.access$2800(ActivityThread.java:125)
01-09 13:33:23.008: E/AndroidRuntime(786):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063)
01-09 13:33:23.008: E/AndroidRuntime(786):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-09 13:33:23.008: E/AndroidRuntime(786):  at android.os.Looper.loop(Looper.java:123)
01-09 13:33:23.008: E/AndroidRuntime(786):  at android.app.ActivityThread.main(ActivityThread.java:4627)
01-09 13:33:23.008: E/AndroidRuntime(786):  at java.lang.reflect.Method.invokeNative(Native Method)
01-09 13:33:23.008: E/AndroidRuntime(786):  at java.lang.reflect.Method.invoke(Method.java:521)
01-09 13:33:23.008: E/AndroidRuntime(786):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-09 13:33:23.008: E/AndroidRuntime(786):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-09 13:33:23.008: E/AndroidRuntime(786):  at dalvik.system.NativeStart.main(Native Method)
01-09 13:33:23.008: E/AndroidRuntime(786): Caused by: java.lang.IllegalArgumentException: column 'number' does not exist
01-09 13:33:23.008: E/AndroidRuntime(786):  at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
01-09 13:33:23.008: E/AndroidRuntime(786):  at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:99)
01-09 13:33:23.008: E/AndroidRuntime(786):  at sra.com.ContactsDemo.onActivityResult(ContactsDemo.java:49)
01-09 13:33:23.008: E/AndroidRuntime(786):  at android.app.Activity.dispatchActivityResult(Activity.java:3890)
01-09 13:33:23.008: E/AndroidRuntime(786):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
01-09 13:33:23.008: E/AndroidRuntime(786):  ... 11 more

【问题讨论】:

标签: android android-contacts


【解决方案1】:

通过查看答案,我认为您已经了解了如何获取联系人的答案,现在您想要在您的活动中获取选定的联系人。

要获取特定于联系人姓名的联系人号码:

ContentResolver contactResolver = getContentResolver(); 
Cursor cursor = contactResolver.query(Phone.CONTENT_URI, null, Phone.DISPLAY_NAME + "=?", new String[]{contactName}, null);

if(cursor.getCount() > 0){
    cursor.moveToFirst();
    do {
       String number = cursor.getString(mCursor.getColumnIndex(Phone.NUMBER));
    }while (cursor.moveToNext() ); 
}

注意:这里contactName是您要填写联系电话的联系人姓名。

我假设您已经显示了带有复选框的联系人 ListView,这是您获取联系人列表的解决方案 用户对您的活动:

1. 使用startActivityForResult() 开始您的联系活动。

2.在联系活动中初始化ArrayList变量说它contactArrayList

3.当用户checks the checkbox时,将此联系人添加到您的contactArrayList并继续添加,当unchecks时,然后从contactArrayList中删除联系人。

4. 当用户按下完成后,使用您在contactArrayList 添加的所选联系人列表设置结果,如下所示:

Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putStringArrayList("contacts", contactArrayList);
intent.putExtras(bundle);
setResult(RESULT_OK, intent);

finish()这个活动。

5. 在您的呼叫活动覆盖上:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == RESULT_OK && data != null ){
             Bundle bundle = new Bundle();
             bundle =  data.getExtras();
             ArrayList list = bundle.getStringArrayList("contacts");
    }
}

注意:以上代码是在 2.3.3 上测试的。

【讨论】:

    【解决方案2】:

    请试试这个代码

    Cursor c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        String name, number = "";
        String id;
        c.moveToFirst();
        for (int i = 0; i < c.getCount(); i++) {
            name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            id = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
    
            if (Integer.parseInt(c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                Cursor pCur = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id },
                        null);
                while (pCur.moveToNext()) {
                    number = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                }
            }
            Log.i("name ", name + " ");
            Log.i("number ", number + " ");
            c.moveToNext();
    

    【讨论】:

    • 通过使用此代码段,我可以获取所有联系人,但我只想获取选定的联系人并在我的列表视图中显示该联系人的姓名和号码。我该怎么做?
    【解决方案3】:

    这里有光标 c

    Cursor c = getContentResolver().query(Phones.CONTENT_URI, null, null,null, null);
    

    获取名字

    String name = c.getString(c.getColumnIndex(People.NAME));
    

    获取号码

    String number = c.getString(c.getColumnIndex(People.NUMBER));
    

    您可以遍历光标并将它们保存到列表中。创建一个复选框列表视图并与该列表绑定。

    【讨论】:

    • 你是在模拟器还是手机上测试?
    • 您的联系人列表中需要有联系人。
    • 我在模拟器和手机上的联系人列表中都有联系人,它们的行为相同
    【解决方案4】:

    简单地说,有一个联系人数据对象,每当您选择列表中的任何项目时,将该联系人的值设置到此字段中。

    AdapterView.onItemClickListener()
    {
       public void onItemClick(AdapterView list, View view, int position, long id)
       {
          Contact contact=listContacts.get(position);
          selectedContact=contact;//If Done Button on List
          //if activity is to be finished on selection
          { 
             Intent intent=new Intent();
             intent.putExtra(KEY_NAME, contact.Name);
             ....
             setResult(RESULT_OK, intent);
             finish();
          }
        }
    }
    

    【讨论】:

      【解决方案5】:

      试试下面的代码:

      ContentResolver contactResolver = getContentResolver();     
      Cursor cursor = contactResolver.query(Phone.CONTENT_URI, null, Phone.DISPLAY_NAME + "=?", new String[]{contactName}, null);    
      if(cursor.getCount() > 0){    
          cursor.moveToFirst();    
          do {    
             String number = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));    
          }while (cursor.moveToNext() );     
      }
      

      【讨论】:

        猜你喜欢
        • 2013-04-12
        • 2016-06-20
        • 1970-01-01
        • 1970-01-01
        • 2015-11-17
        • 2012-05-28
        • 1970-01-01
        • 2015-01-08
        • 1970-01-01
        相关资源
        最近更新 更多