如何调用android通讯录?

问题描述

如何调用android通讯录?
我正在写一个android应用程序,需要调用手机的通讯录。我需要调用通讯录的功能,选择一个联系人,然后将联系人的名字返回到我的应用程序中。下边是我在网上找的代码,但是不起作用。

import android.app.ListActivity;import android.content.Intent;import android.database.Cursor;import android.os.Bundle;import android.provider.Contacts.People;import android.view.View;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.SimpleCursorAdapter;import android.widget.TextView;public class Contacts extends ListActivity {    private ListAdapter mAdapter;    public TextView pbContact;    public static String PBCONTACT;    public static final int ACTIVITY_EDIT=1;    private static final int ACTIVITY_CREATE=0;    // 当activity第一次创建完成后调用    @Override    public void onCreate(Bundle icicle) {        super.onCreate(icicle);        Cursor C = getContentResolver().query(People.CONTENT_URI null null null null);        startManagingCursor(C);        String[] columns = new String[] {People.NAME};        int[] names = new int[] {R.id.row_entry};        mAdapter = new SimpleCursorAdapter(this R.layout.mycontacts C columns names);        setListAdapter(mAdapter);    }     @Override    protected void onListItemClick(ListView l View v int position long id) {        super.onListItemClick(l v position id);        Cursor C = (Cursor) mAdapter.getItem(position);        PBCONTACT = C.getString(C.getColumnIndex(People.NAME));        Intent i = new Intent(this NoteEdit.class);        startActivityForResult(i ACTIVITY_CREATE);    }}

解决方案

我不能100%的确定你的示例代码应该是做什么的,但是下边的摘要应该能够帮助你调用通讯录的功能,选择一个联系人,然后将你联系人的名字返回到你的app中。

这个过程有三步:
1)
许可
向你的应用程序的manifest中添加读取通讯录数据的许可

<uses-permission android:name=""android.permission.READ_CONTACTS""/>

2)
调用Contact Picker
在你的activity中,创建一个Intent,用来请求系统查找一个能够执行一个从Contacts URI的项目中发出的PICK动作的activity,

Intent intent = new Intent(Intent.ACTION_PICK ContactsContract.Contacts.CONTENT_URI);

调用startActivityForResult在Intent中传递(和一个整数的请求代码,在这个例子中是PICK_CONTACT )。这将导致android启动一个已经被等级的activity,用来支持在People.CONTENT_URI上的ACTION_PICK ,然后当按下选择(或者取消)的时候返回到这个activity。

startActivityForResult(intent PICK_CONTACT);

3)
仍然在你的activity中,重写onActivityResul方法来监听在你的第二个步骤中启动的activi'select a contact' activity的回调。你应该检查反馈的请求代码是否匹配你的期望值,结果代码是否是 RESULT_OK。
通过在数据Intent参数中调用getData()你可以获得选择的联系人的URI。为了获得选择的联系人的名字你需要使用URI从返回的游标中创建一个新的查询和提取的参数。

@Overridepublic 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 name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));        }      }      break;  }}

解决方案二:
对于android 2.2 Froyo版本我是这样做的:基本上是用eclipse来创建一个类,像:public class SomePickContactName 继承Activity
然后插入这个代码。记得加private类变量和在我的版本代码中被引用的常量

protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);         Intent intentContact = new Intent(Intent.ACTION_PICK ContactsContract.Contacts.CONTENT_URI);   startActivityForResult(intentContact PICK_CONTACT);}public void onActivityResult(int requestCode int resultCode Intent intent) {  if (requestCode == PICK_CONTACT)  {             getContactInfo(intent);           }}protected void getContactInfo(Intent intent){   Cursor cursor =  managedQuery(intent.getData() null null null null);         while (cursor.moveToNext())    {                  String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));       name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));        String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));       if ( hasPhone.equalsIgnoreCase(""1""))           hasPhone = ""true"";       else           hasPhone = ""false"" ;       if (Boolean.parseBoolean(hasPhone))        {        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI nullContactsContract.CommonDataKinds.Phone.CONTACT_ID +"" = ""+ contactIdnull null);        while (phones.moveToNext())         {          phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));        }        phones.close();       }       Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URInullContactsContract.CommonDataKinds.Email.CONTACT_ID + "" = "" + contactIdnull null);       while (emails.moveToNext())        {        emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));       }       emails.close();    Cursor address = getContentResolver().query(                ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI                null                ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + "" = "" + contactId                null null);    while (address.moveToNext())     {       poBox      = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));      street     = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));      city       = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));      state      = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));      postalCode = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));      country    = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));      type       = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));    }       }            cursor.close();}
时间: 2025-01-02 06:59:06

如何调用android通讯录?的相关文章

android调用系统通讯录号码全显示

问题描述 android调用系统通讯录号码全显示 各位大牛,android调用系统通讯录时如何让号码全显示出来?默认是只显示姓名的,如图1,怎么弄成图2的效果,淘宝.京东等的手机充值选择号码都用图2的界面,而且和系统通讯录风格一致,应该不是自定义的通讯录. 解决方案 android调用系统通讯录android 内容提供者 系统通讯录iOS开发调用系统通讯录获取电话号码

按键-Android 通讯录拨号键盘的问题

问题描述 Android 通讯录拨号键盘的问题 当有按键被按下时,就弹出拨打电话的button,当键输入框的内容清空时,拨号button也随之消失,是如何实现的? 解决方案 button.setVisibility(View.GONE);button隐藏button.setVisibility(View.Visible);显示 解决方案二: 监听edittext变化,有内容就setVisibility(View.Visible),没有就Gone

不用背景变暗调用android对话框

问题描述 不用背景变暗调用android对话框 我有这个非常漂亮的对话框视图,我设置了我的UserInputDialog类为: <LinearLayout android:id=""@+id/LinearLayout01"" android:layout_width=""fill_parent"" android:layout_height=""fill_parent"" andr

jni- cocos2d中函数通过JNI调用android中类方法的疑问

问题描述 cocos2d中函数通过JNI调用android中类方法的疑问 如题,我试图在cocos2d中调用android的某方法,android中被调用方法如下: public class AppActivity extends Cocos2dxActivity { static { System.loadLibrary("cocos2dcpp"); } public static void gotoActivity() { Intent in = new Intent(AppAct

android 通讯录开发 格式化电话号码

问题描述 android 通讯录开发 格式化电话号码 android 通讯录开发:使用PhoneNumberUtils.formatNumber 方法格式化电话号码,没用,返回值没有任何变化. 解决方案 http://www.2cto.com/kf/201401/274837.html

调用android系统相机拍照然后在照片右下角显示经纬度和当前系统时间并且实现换行

问题描述 调用android系统相机拍照然后在照片右下角显示经纬度和当前系统时间并且实现换行 我用自己的手机不管是横拍还是竖拍文字都是在右下角并且换行了,用别的手机横拍 没有什么问题,竖拍就显示的不全在右边,怎么解决这个适配问题 解决方案 获取图片,用画布 画笔画上去 解决方案二: android调用系统相机拍照保存照片并显示在当前界面android--调用系统相机拍照,显示并保存照片 - zhengwenandroid 调用系统相机拍照的各种异常处理

android 通讯录,按字母排序

问题描述 android 通讯录,按字母排序 如何在android开发中开发一个联系人通讯录,根据姓名排序 解决方案 处理List集合,然后给集合排序放到ListView中 解决方案二: 如果只是排序,很简单.采用java自带的Collections.sort(***,***)方法.代码可以这样写: List list =new ArrayList(); //Test是你的联系人实体.假设联系人的姓名是name,并且实体里有个方法getName(),返回的是联系人的名字 //然后对list赋值

调用Android自带日历功能(日历列表单、添加一个日历事件)

调用Android自带日历功能  觉得这篇文章不错,转载过来. 转载:http://blog.csdn.net/djy1992/article/details/9948393 Android手机配备有一个内置的日历应用程序.第三方应用程序可以利用日历内容提供商接口读取用户的日历信息和安排在日历新的事件.这个日历可以直接同步用户的谷歌日历.  不幸的是,没有文档和Android手机的日历应用集成,因为有另外一个联系人应用程序.相反,本文所提供的所有信息,将会通过逆向工程的谷歌日历内容提供商.该接口

crossapp有没有现成接口可调用手机通讯录啊

问题描述 大家好,我是crossapp初学者,现在公司在做一款社交类的**应用app,我想请教一下crossapp有没有现成的接口可以调用手机通讯录的办法啊,还是得安卓和Ios分情况自己写? 解决方案 现在有获取通讯录的方法.CADevice::getAddressBook()