如何在android中阅读联系人

时间:2013-04-08 18:29:34

标签: android

我正在开发一个Android sms应用程序,我想在其中使用以下代码阅读联系人的联系电话号码

 Intent ContactPickerIntent = new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI);
            ContactPickerIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
            startActivityForResult(ContactPickerIntent, CONTACT_PICKER_RESULT);  

它在模拟器上工作正常,但在设备上没有。我应该做些什么改变才能让它在设备上运行。

这是我的onactivityresult功能

protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
     if (resultCode == RESULT_OK)
     {  
         switch (requestCode) 
         {  
         case CONTACT_PICKER_RESULT:
             Cursor cursor=null;
             try
             {   
                 Uri result = data.getData();
                 Log.v(DEBUG_TAG, "Got a contact result: " + result.toString());

                 // get the contact id from the Uri     
                 String id = result.getLastPathSegment();

                 // query for everything contact number  
                 cursor = getContentResolver().query(  
                      Phone.CONTENT_URI, null,  
                      Phone.CONTACT_ID + "=?",  
                      new String[]{id}, null); 

                 cursor.moveToFirst();
                 int phoneIdx = cursor.getColumnIndex(Phone.NUMBER);  
                 if (cursor.moveToFirst())
                 {   
                     phonenofromcontact = cursor.getString(phoneIdx);
                     finallistofnumberstosendmsg +=","+phonenofromcontact;
                     Log.v(DEBUG_TAG, "Got phone no : " + phonenofromcontact);  
                 }
                 else 
                 {                                
                     Log.w(DEBUG_TAG, "No results"); 
                 }
             }
             catch(Exception e)
             {
                 Log.e(DEBUG_TAG, "Failed to get contact number", e);
             }
             finally
             {
                 if (cursor != null)
                 {  
                     cursor.close();
                 }
             }
             phonePhoneno= (EditText)findViewById(R.id.phonenofromcontact);
             phonePhoneno.setText(finallistofnumberstosendmsg);
             //phonePhoneno.setText(phonenofromcontact);
             if(phonenofromcontact.length()==0)
             {
                 Toast.makeText(this, "No contact number found for this contact",
                         Toast.LENGTH_LONG).show(); 
             }
            break;  
         }  
     } 
     else
     {  
         Log.w(DEBUG_TAG, "Warning: activity result not ok");
     }  
 } 

4 个答案:

答案 0 :(得分:2)

您正在使用以下方式过滤您的意图:

ContactPickerIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);

告诉Contacts Provider仅返回包含Phone内容类型的联系信息。

因此,联系人提供程序返回的ID是_ID表的ContactsContract.Data - 而不是CONTACT_ID

尝试将光标查询更改为:

 // query for everything contact number  
 cursor = getContentResolver().query(  
              Phone.CONTENT_URI, null,  
              Phone._ID + "=?",  
              new String[]{id}, null); 

这应该会返回您选择的联系人号码。

顺便说一句,如果您没有在Intent上调用ContactPickerIntent.setType,那么您最初编写的数据查询将起作用(如果您已进行了上述更改 - 那么您仍然需要调用它! )

它可能在你的模拟器上运气 - 我猜你可能在你的模拟器上只有一个联系人和一个电话号码?数据表的CONTACT_ID_ID都可能都是1,这将巧合地返回正确的行。

答案 1 :(得分:0)

您需要将权限android.permission.READ_CONTACTS添加到AndroidManifest.xml。

答案 2 :(得分:0)

需要android清单文件中的权限:

<uses-permission android:name="android.permission.READ_CONTACTS" >
    </uses-permission>

这是我的工作代码:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people/"));
startActivity(intent);

答案 3 :(得分:0)

只需更改

// query for everything contact number  
                 cursor = getContentResolver().query(  
                      Phone.CONTENT_URI, null,  
                      Phone.CONTACT_ID + "=?",  
                      new String[]{id}, null);

// query for everything contact number  
                 cursor = getContentResolver().query(  
                      Phone.CONTENT_URI, null,  
                      Phone._ID + "=?",  
                      new String[]{id}, null);