android 获取联系人的姓名和电话,无法获取电话

============问题描述============

代码如下

package com.example.sysaction;

import android.net.Uri;

import android.os.Build;

import android.os.Bundle;

import android.provider.ContactsContract;

import android.annotation.SuppressLint;

import android.annotation.TargetApi;

import android.app.Activity;

import android.content.CursorLoader;

import android.content.Intent;

import android.database.Cursor;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

public class SysAction extends Activity {

	final int PICK_CONTACT = 0;

	@Override

	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

		setContentView(R.layout.main);

		Button bn = (Button)findViewById(R.id.bn);

		bn.setOnClickListener(new OnClickListener(){

			@Override

			public void onClick(View v) {

				// TODO Auto-generated method stub

				Intent intent = new Intent();

				intent.setAction(Intent.ACTION_GET_CONTENT);

				intent.setType("vnd.android.cursor.item/phone");

				startActivityForResult(intent,PICK_CONTACT);

			}

		});

	}

	@TargetApi(Build.VERSION_CODES.HONEYCOMB)

	@SuppressLint("NewApi")

	public void onActivityResult(int requestCode, int resultCode, Intent data)

	{

		super.onActivityResult(requestCode, resultCode, data);

		switch(requestCode)

		{

		case(PICK_CONTACT):

			if(resultCode == Activity.RESULT_OK)

			{

				Uri contactData = data.getData();

				CursorLoader cursorLoader = new CursorLoader(this, contactData, null, null, null, null);

				Cursor cursor =cursorLoader.loadInBackground();

				if(cursor.moveToFirst())

				{

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

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

					String phoneNumber = "此联系人暂未输入电话号码";

					Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +"="+contactId, null, null);

					if(phones.moveToFirst())

					{

						phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

					}

					phones.close();

					EditText show = (EditText)findViewById(R.id.show);

					show.setText(name);

					EditText phone = (EditText)findViewById(R.id.phone);

					phone.setText(phoneNumber);

				}

				cursor.close();

			}

		break;

		}

	}

}

ContactsContract.CommonDataKinds.Phone.CONTACT_ID 返回的值为null

============解决方案1============

引用 3 楼 bdmh 的回复:

不是所有的都能拿到,由于移动运营商没有把手机号码的数据写入到sim卡中

你这是从外星来的吗

============解决方案2============

intent.setType("vnd.android.cursor.item/phone");

改成

intent.setType("vnd.android.cursor.item/phone_v2");

然后去掉重复创建的cursor。

代码如下:

public class SysAction extends Activity {

	 

    final int PICK_CONTACT = 0;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_sys_action);

         

        Button bn = (Button)findViewById(R.id.bn);

        bn.setOnClickListener(new OnClickListener(){

            @Override

            public void onClick(View v) {

                // TODO Auto-generated method stub

                Intent intent = new Intent();

                intent.setAction(Intent.ACTION_GET_CONTENT);

                intent.setType("vnd.android.cursor.item/phone_v2");

                startActivityForResult(intent,PICK_CONTACT);

            }

        });

    }

 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)

    @SuppressLint("NewApi")

    public void onActivityResult(int requestCode, int resultCode, Intent data)

    {

        super.onActivityResult(requestCode, resultCode, data);

        switch(requestCode)

        {

        case(PICK_CONTACT):

            if(resultCode == Activity.RESULT_OK)

            {

                Uri contactData = data.getData();

                CursorLoader cursorLoader = new CursorLoader(this, contactData, null, null, null, null);

                Cursor cursor =cursorLoader.loadInBackground();

                if (cursor.moveToFirst())

                {

                    String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

                    String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                    EditText show = (EditText)findViewById(R.id.show);

                    show.setText(name);

                    EditText phone = (EditText)findViewById(R.id.phone);

                    phone.setText(phoneNumber);

                }

                cursor.close();

            }

        break;

         

        }

    }

}

============解决方案3============

这样:

/**读取通讯录异步Handler*/

private AsyncQueryHandler asyncQuery;

/**

* 读取通讯录

*/

private void readContacts(){

asyncQuery = new ContactAsyncQueryHandler(getContentResolver());

Uri uri = Uri.parse("content://com.android.contacts/data/phones");

String[] projection = { "_id", "display_name", "data1", "sort_key" };

asyncQuery.startQuery(0, null, uri, projection, null, null,

"sort_key COLLATE LOCALIZED asc");

}

//异步查询联系人

private class ContactAsyncQueryHandler extends AsyncQueryHandler {

public ContactAsyncQueryHandler(ContentResolver cr) {

super(cr);

}

protected void onQueryComplete(int token, Object cookie, Cursor cursor) {

if (cursor != null && cursor.getCount() > 0) {

ArrayList<CallsItem> list = new ArrayList<CallsItem>();

cursor.moveToFirst();

for (int i = 0; i < cursor.getCount(); i++) {

CallsItem item = new CallsItem();

cursor.moveToPosition(i);

String name = cursor.getString(1);

String number = cursor.getString(2);

String sortKey = cursor.getString(3);

if (number.startsWith("+86")) {

number = number.substring(3); //去掉+86

}

item.name = name;

item.number = number;

item.sort = sortKey;

list.add(item);

//                    System.out.println("name:" + name + " number:" + number + " sort:" + sortKey);

}

app.allList = list;

}

}

}

时间: 2024-08-27 15:42:13

android 获取联系人的姓名和电话,无法获取电话的相关文章

Android 获取联系人手机号码、姓名、地址、公司、邮箱、生日

public void testGetAllContact() throws Throwable { //获取联系人信息的Uri Uri uri = ContactsContract.Contacts.CONTENT_URI; //获取ContentResolver ContentResolver contentResolver = ContactListActivity.this.getContentResolver(); //查询数据,返回Cursor Cursor cursor = con

Android获取手机联系人的姓名和电话

Android获取手机联系人的姓名和电话 主要是用到了跳入手机联系人的intent和获取手机联系人信息的内容提供者,直接上代码 注:此贴是借鉴别人的帖子加了一些自己的东西写出的,原帖地址明日附上: / 首先 我们需要跳入手机通讯录 Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent, 0); // 之后,我们需要重写

ANDROID之获取联系人

Android入门中,记录学习中的遇到的问题和一些个人总结. 联系人数据库路径为:/data/data/com.android.providers.contacts/database/contacts2.db 权限问题:安卓6.0以上只是在XML中写权限还不够,代码中也需要写. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_CONTA

Android通讯录管理(获取联系人、通话记录、短信消息)(二)

http://blog.csdn.net/wwj_748/article/details/19970271 Android通讯录管理(获取联系人.通话记录.短信消息)(二) 2014-02-26 11:40 9076人阅读 评论(11) 收藏 举报  分类: [Android通讯录模块开发](10)  版权声明:本文为博主原创文章,未经博主允许不得转载. Android通讯录管理(获取联系人.通话记录.短信消息)(二) 前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现. 同

Android 手机卫士--获取联系人信息并显示与回显

前面的文章已经实现相关的布局,本文接着进行相关的功能实现 本文地址:http://www.cnblogs.com/wuyudong/p/5951794.html,转载请注明出处. 读取系统联系人 当点击“选择联系人”按钮后,弹出联系人列表,读取系统联系人分如下几个步骤: 系统联系人提供了一个内容提供者,通过内容解析器,匹配Url地址 1,内容解析器 2,Url地址,查看系统联系人数据库,内容提供者源码 先看api文档的清单文件,后看java类(联系人数据库有多张表) contents://com

【Android Developers Training】 99. 获取联系人详细信息

注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer.android.com/training/contacts-provider/retrieve-details.html 这节课将会展示如何获取一个联系人的详细数据,比如电子邮件地址,电话号码,等等.当用户获得一个联系人后,他会想要查看他的详细信息.你可以展示给他们所有的信息,或者只展示某一特定类

如何获取android手机联系人并按字母展示(一)

android提供了本地数据库的查询uri,可以查询出数据: 采用一个AsyncQueryHandler来进行查询, AsyncQueryHandler自己开启了线程来进行数据查询,很方便 protected AsyncQueryHandler mQueryHandler; protected final void queryPersonal() { mQueryHandler.startQuery(QUERY_TOKEN, null, ContactsContract.Contacts.CON

如何获取android手机联系人并按字母展示(二)

下面写怎么让每个首字母相同的联系人归类展示: 在adapter implement SectionIndexer 这样adapter里必须实现以下3个接口: @Override public Object[] getSections() { //section的集合 } @Override public int getPositionForSection(int section) {//当前section的位置 } @Override public int getSectionForPositi

如何获取android手机联系人并按字母展示(三)

如果获取contact的头像信息并展示: 如何根据photoId来获取bitmap: public static Bitmap getContactPhoto(Context context, long photoId, BitmapFactory.Options options) { if (photoId < 0) { return null; } Cursor cursor = null; try { cursor = context.getContentResolver().query(