我正在开发一个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");
}
}
答案 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);