Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中检索联系人姓名和电话号码_Android_Contacts - Fatal编程技术网

如何在Android中检索联系人姓名和电话号码

如何在Android中检索联系人姓名和电话号码,android,contacts,Android,Contacts,我正在尝试检索带有姓名和电话号码的联系人列表。我尝试以下代码: // Get a cursor over every contact. Cursor cursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null); // Let the activity manage the curso

我正在尝试检索带有姓名和电话号码的联系人列表。我尝试以下代码:

 // Get a cursor over every contact.
    Cursor cursor = getContentResolver().query(People.CONTENT_URI, 
                                               null, null, null, null); 
    // Let the activity manage the cursor lifecycle.
    startManagingCursor(cursor);
    // Use the convenience properties to get the index of the columns
    int nameIdx = cursor.getColumnIndexOrThrow(People.NAME); 

    int phoneIdx = cursor. getColumnIndexOrThrow(People.NUMBER);
    String[] result = new String[cursor.getCount()];
    if (cursor.moveToFirst())
      do { 
        // Extract the name.
        String name = cursor.getString(nameIdx);
        // Extract the phone number.
        String phone = cursor.getString(phoneIdx);
        result[cursor.getPosition()] = name + "-" +" "+  phone;
      } while(cursor.moveToNext());
此代码应返回一个包含所有联系人姓名及其电话号码的数组,但此代码仅返回联系人姓名,电话号码中返回NULL

示例输出:

 John - null

不要像下面那样使用不推荐的API访问

        Cursor cursor = getContentResolver().
    query( Contacts.CONTENT_URI, 
            new String[]{Contacts.DISPLAY_NAME}, null, null,null);
    if(cursor!=null){
        while(cursor.moveToNext()){
            Cursor c = getContentResolver().query(Phone.CONTENT_URI, new String[]{Phone.NUMBER, Phone.TYPE}, 
                    " DISPLAY_NAME = '"+cursor.getString(cursor.getColumnIndex(Contacts.DISPLAY_NAME))+"'", null, null);
            while(c.moveToNext()){
                switch(c.getInt(c.getColumnIndex(Phone.TYPE))){
                case Phone.TYPE_MOBILE :
                case Phone.TYPE_HOME :
                case Phone.TYPE_WORK :
                case Phone.TYPE_OTHER :
                }
            }
        }
    }

地狱男孩是对的,Phone.xxx被腐蚀了。我使用查找uri这样做:

Uri look = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, "23N9983726428fnwe");
Intent i = new Intent(Intent.ACTION_VIEW); 
i.setData(look);

在第一行中尝试Contacts.xxx,您将找到正确的解决方案。

查看从android mobile检索联系人的示例代码

    Cursor cursor = context.getContentResolver().query(
                ContactsContract.Contacts.CONTENT_URI, null, null, null, null);


String contactId = cursor.getString(cursor
                    .getColumnIndex(ContactsContract.Contacts._ID));

String name = cursor.getString(cursor                   .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

            Cursor phones = context.getContentResolver().query(
                    Phone.CONTENT_URI, null,
                    Phone.CONTACT_ID + " = " + contactId, null, null);
            while (phones.moveToNext()) {
                String number = phones.getString(phones
                        .getColumnIndex(Phone.NUMBER));
                int type = phones.getInt(phones.getColumnIndex(Phone.TYPE));
                switch (type) {
                case Phone.TYPE_HOME:                   
                     Log.i("TYPE_HOME", "" + number);
                    break;
                case Phone.TYPE_MOBILE:                 
                    Log.i("TYPE_MOBILE", "" + number);
                    break;
                case Phone.TYPE_WORK:                   
                     Log.i("TYPE_WORK", "" + number);
                    break;
                case Phone.TYPE_FAX_WORK:                   
                    Log.i("TYPE_FAX_WORK", "" + number);
                    break;
                case Phone.TYPE_FAX_HOME:
                    Log.i("TYPE_FAX_HOME", "" + number);
                    break;

                case Phone.TYPE_OTHER:
                    Log.i("TYPE_OTHER", "" + number);
                    break;
                }
            }
            phones.close();
cursor.close();
请尝试下面的代码

Cursor managedCursor = getContentResolver()
.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
 new String[] {Phone._ID, Phone.DISPLAY_NAME, Phone.NUMBER}, null, null,  Phone.DISPLAY_NAME + " ASC");
在Android清单中:

    <uses-permission android:name="android.permission.READ_CONTACTS" />
然后,您必须捕捉动作拾取联系人的结果:

@Override 
public void onActivityResult(int reqCode, int resultCode, Intent data){ 
    super.onActivityResult(reqCode, resultCode, data);

    switch(reqCode)
    {
       case (PICK_CONTACT):
         if (resultCode == Activity.RESULT_OK)
         {
             Uri contactData = data.getData();
             Cursor c = managedQuery(contactData, null, null, null, null);
              if (c.moveToFirst())
              {
                  String id = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts._ID));

                  String hasPhone = c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

                  if (hasPhone.equalsIgnoreCase("1")) 
                  {
                      Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, 
                             ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ id,null, null);
                      phones.moveToFirst();
                      String cNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                       Toast.makeText(getApplicationContext(), cNumber, Toast.LENGTH_SHORT).show();

                      String nameContact = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));

                      editText.setText(nameContact+ " "+ cNumber);
                  }
             }
       }
    }
}

我现在无法模仿你的问题,但想问一下你得到的电话号码是多少?你是否在联系人数据库中检查了这些字段是否存在?然后你如何实际读取电话号码?当我执行
String phone=phone.NUMBER
时,如果一个联系人有多个号码,则返回
data1
,然后如何选择所需号码。我将如何使用
PICK\u contact
创建全局变量“PICK\u contact”:int PICK\u contact=10;谢谢你的回复。我试图按照你的方法,但我有一些问题。。。请检查这里:使用“选择意图”是获取联系人列表的一种更简单的方法!
@Override 
public void onActivityResult(int reqCode, int resultCode, Intent data){ 
    super.onActivityResult(reqCode, resultCode, data);

    switch(reqCode)
    {
       case (PICK_CONTACT):
         if (resultCode == Activity.RESULT_OK)
         {
             Uri contactData = data.getData();
             Cursor c = managedQuery(contactData, null, null, null, null);
              if (c.moveToFirst())
              {
                  String id = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts._ID));

                  String hasPhone = c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

                  if (hasPhone.equalsIgnoreCase("1")) 
                  {
                      Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, 
                             ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ id,null, null);
                      phones.moveToFirst();
                      String cNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                       Toast.makeText(getApplicationContext(), cNumber, Toast.LENGTH_SHORT).show();

                      String nameContact = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));

                      editText.setText(nameContact+ " "+ cNumber);
                  }
             }
       }
    }
}
package com.number.contatcs;

import android.app.Activity;

import android.content.Intent;


import android.database.Cursor;

import android.net.Uri;

import android.os.Bundle;

import android.provider.ContactsContract;

import android.provider.ContactsContract.CommonDataKinds.Phone;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

public class Main2Activity extends Activity {

private static final int CONTACT_PICKER_RESULT = 1001;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    Button getContacts = (Button) findViewById(R.id.button1);
    getContacts.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent i = new Intent(Intent.ACTION_PICK,
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
            startActivityForResult(i, CONTACT_PICKER_RESULT);

        }
    });
}

protected void onActivityResult(int reqCode, int resultCode, Intent data) {
    super.onActivityResult(reqCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        switch (reqCode) {
        case CONTACT_PICKER_RESULT:
            Cursor cursor = null;
            String number = "";
            String lastName = "";
            try {

                Uri result = data.getData();

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

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

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

                int numberIdx = cursor.getColumnIndex(Phone.DATA);

                if (cursor.moveToFirst()) {
                    number = cursor.getString(numberIdx);
                    // lastName =
                    // cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
                } else {
                    // WE FAILED
                }
            } catch (Exception e) {
                // failed
            } finally {
                if (cursor != null) {
                    cursor.close();
                } else {
                }
            }
            EditText numberEditText = (EditText) findViewById(R.id.w);
            numberEditText.setText(number);
            // EditText lastNameEditText =
            // (EditText)findViewById(R.id.last_name);
            // lastNameEditText.setText(lastName);

        }

    }
}
}