如何调用Android联系人列表并从其详细信息屏幕中选择一个电话号码?

she*_*rry 27 android

我已阅读已发布的解决方案,但他们不知道如何使用系统的联系人详细信息屏幕选择要使用的任何一个号码?我正在开发一个短信发送Android应用程序,它提供选择手机的联系人和用户想要发送到的号码....

到目前为止,我还没有找到任何关于选择任何一个号码的信息.它只需要以编程方式完成吗?从数据库中检索所有数字并向其发送短信?

问候

雪莉酒

ste*_*efs 56

嗯,我花了一些时间,但我想我有你需要的答案(即使已经太晚了,但我仍然会把它作为其他人的参考).

在我正在开发的应用程序中,用户可以输入电话号码EditText或点击按钮,然后从电话地址簿中选择一个人.如果此人有多个电话号码,则会有一个下拉列表,他可以在其中选择其中一个.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.contact_picker);

    // this opens the activity. note the  Intent.ACTION_GET_CONTENT
    // and the intent.setType
    ((Button)findViewById(R.id.pick_person)).setOnClickListener( new OnClickListener() {
        @Override
        public void onClick(View v) {
            // user BoD suggests using Intent.ACTION_PICK instead of .ACTION_GET_CONTENT to avoid the chooser
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            // BoD con't: CONTENT_TYPE instead of CONTENT_ITEM_TYPE
            intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
            startActivityForResult(intent, 1);                
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

现在,只要用户选择了一个联系人(并且可能选择了多个电话号码中的一个),您就可以正常方式检索数据:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (data != null) {
        Uri uri = data.getData();

        if (uri != null) {
            Cursor c = null;
            try {
                c = getContentResolver().query(uri, new String[]{ 
                            ContactsContract.CommonDataKinds.Phone.NUMBER,  
                            ContactsContract.CommonDataKinds.Phone.TYPE },
                        null, null, null);

                if (c != null && c.moveToFirst()) {
                    String number = c.getString(0);
                    int type = c.getInt(1);
                    showSelectedNumber(type, number);
                }
            } finally {
                if (c != null) {
                    c.close();
                }
            }
        }
    }
}

public void showSelectedNumber(int type, String number) {
    Toast.makeText(this, type + ": " + number, Toast.LENGTH_LONG).show();      
}
Run Code Online (Sandbox Code Playgroud)

这是dev.android上CommonDataKinds.Phone文档.

int"type"告诉你数字的类型:mobile(2),home(1),work(3)等等.

注意:在用户选择联系人之后,他得到一个数字微调器,没有数字类型的指示.这不是真正的用户友好:如果一个联系人有5个分配的号码......呃,这些中的哪一个是传真号码?

另外注意:上面的例子需要sdk> 5(Android 2.0+),所以没有1.6(= sdk 4).1.6有不同的api,如果你想支持这两个版本,请阅读dev.android上有关contacts API文章.

祝好运.

免责声明:我从PickContact.java示例中复制了大部分代码

  • 使用ACTION_GET_CONTENT和CONTENT_ITEM_TYPE,您有时会在选择器中获取其他应用程序(例如DropBox和OI文件管理器),这可能是不合需要的.使用ACTION_PICK和CONTENT_TYPE代替解决了这个问题. (8认同)