0

我想从联系人中检索手机号码(我想发送短信)。这是我的代码:

//Selecting the contact
        Button buttonPickContact = (Button)findViewById(R.id.pickcontact);
        buttonPickContact.setOnClickListener(new Button.OnClickListener(){

            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
                startActivityForResult(intent, RQS_PICK_CONTACT);
            }});


@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);

        Cursor cursor = null;
        mName.setText(context.getString(R.string.not_available));
        mNumber.setText(context.getString(R.string.not_available));

        if(requestCode == RQS_PICK_CONTACT && resultCode == RESULT_OK && data != null){
            Log.d(TAG, "requestCode, resultCode, data ok"); 
            Uri uri = data.getData(); 
            try{
                String[] projection = new String[] {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER};
//              cursor =  getContentResolver().query(uri, projection, null, null, null);
                cursor =  getContentResolver().query(uri, null, null, null, null);
                cursor.moveToFirst();
                Log.d(TAG, "Trying to retrieve the name and the number"); 
                String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                String hasNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER)); 

                Log.d(TAG, "hasNumber "+hasNumber); 
                mName.setText(name);

                if(hasNumber.trim().equals("1")){
                    Log.d(TAG, "contact has telephone number"); 
                    //set name and number
                    String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    mNumber.setText(phoneNumber);
                }

            }catch(Exception ex){
                CharSequence text = context.getString(R.string.cannot_choose_contact); 
                Toast toast = Toast.makeText(context, text, duration);
                toast.show();
            }
            if(cursor!= null && !cursor.isClosed()){
                cursor.close(); 
            }
        }else{
            CharSequence text = context.getString(R.string.cannot_choose_contact); 
            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
        }
    }

我得到:无法从 CursorWindow 读取第 0 行第 -1 列...

如何获取电话号码 - 我是否尝试从右栏中检索它?

提前感谢您的回答,

4

2 回答 2

1

联系人的详细数据包含在与主要联系人本身不同的表格中(有关详细信息,请参阅联系人 API 指南)。由于您正在发送短信,因此仅获取具有关联电话号码的联系人可能更有用,因此您不妨直接前往包含电话号码的表格。对于 URI,我使用:

CommonDataKinds.Phone.CONTENT_URI

那你就不用担心了HAS_PHONE_NUMBER。乍一看,您的其余代码看起来正确或非常接近。如果您想继续您的原始路径,无论如何您都必须对此表进行单独查询,但请提供您最初找到的联系人的 ID。

于 2013-02-22T19:45:18.117 回答
1
  1. 使用 CursorLoader 进行查询。总是。如果继续在 UI 线程上进行查询,最终会遇到挂起系统并获得 ANR 的情况。
  2. 您正在请求用户从联系人表中选择联系人,因此您将返回一个指向联系人中联系人的 URI。
  3. 处理此问题的一个技巧是使用 Uri.getLastPathSegment() 从返回的 URI 中去除联系人的 LOOKUP_KEY。然后在 ContactsContract.Data 中搜索 LOOKUP_KEY 和 MIMETYPE 值 CommonDataKinds.Email.CONTENT_ITEM_TYPE。根据您的代码,这将是:

mLookupKey = uri.getLastPathSegment(); 字符串 SELECTION = Data.LOOKUP_KEY + " = ?" + " AND " + Data.MIMETYPE + " = ?"; String[] selectionArgs = { mLookupKey, Email.CONTENT_ITEM_TYPE }; ...

于 2013-02-22T22:03:29.603 回答