0

我正在开发一个 android 短信应用程序,我想在其中使用以下代码从联系人中读取联系人号码

 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

4 回答 4

2

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

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

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

因此,Contacts Provider 返回的 ID 是_ID表的ContactsContract.Data- 而不是CONTACT_ID

尝试将光标查询更改为:

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

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

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

它可能很幸运地在你的模拟器上工作 - 我猜你的模拟器上可能有一个联系人与一个电话号码?很可能 Data 表的 theCONTACT_ID和 the_ID都为 1,这会巧合地返回正确的行。

于 2013-04-08T20:06:59.860 回答
0

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

于 2013-04-08T18:34:31.170 回答
0

需要 android manifest 文件中的权限:

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

这是我的工作代码:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people/"));
startActivity(intent);
于 2013-04-08T18:39:36.950 回答
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);
于 2013-11-03T15:16:46.750 回答