Android实现获取联系人电话号码功能

本篇文档主要记录一下获取联系人的电话号码的一种方式。

1、选择联系人

............
//构造一个隐式的Intent,拉起联系人界面
final Intent pickIntent = new Intent(Intent.ACTION_PICK,
  ContactsContract.Contacts.CONTENT_URI);

mSuspectButton = (Button)v.findViewById(R.id.crime_suspect);
mSuspectButton.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
  startActivityForResult(pickIntent, REQUEST_CONTACT);
 }
});
...........

2、处理选择结果

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
 ...........
 } else if (requestCode == REQUEST_CONTACT && data != null) {
  //在联系人界面选择完毕后,返回的结果中携带了对应的Uri
  Uri contactUri = data.getData();

  String[] queryFields = new String[] {
    ContactsContract.Contacts.DISPLAY_NAME,
    //查询联系人对应的contactId
    ContactsContract.Contacts._ID
  };

  Cursor c = getActivity().getContentResolver()
    .query(contactUri, queryFields, null, null, null);

  if (c == null) {
   return;
  }

  try {
   if (c.getCount() == 0) {
    return;
   }

   c.moveToFirst();

   //联系人的名称
   String suspect = c.getString(0);
   mCrime.setSuspect(suspect);
   mSuspectButton.setText(suspect);

   //记录联系人的contactId
   mCrime.setContactId(c.getString(1));
   mDialButton.setEnabled(true);
  } finally {
   c.close();
  }
 }
}

3、申请运行时权限

在Android6.0以后,READ_CONTACTS变为运行时权限。
因此,除了在AndroidManifest.xml中声明权限外(兼容低版本),还需要在代码中主动申请。

...............
mDialButton = (Button) v.findViewById(R.id.crime_dial);
mDialButton.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
  //SDK >= 23时,定义了Activity.checkSelfPermission方法
  //为了避免对SDK版本的判断,兼容低版本,一般都是使用兼容库中的方法
  //此处使用的是android.support.v4.app.Fragment中的checkSelfPermission
  //对于Activity,可以使用ActivityCompat中的方法
  int hasReadContactsPermission = checkSelfPermission(getContext(),
    android.Manifest.permission.READ_CONTACTS);

  //判断是否已有对应权限
  //用户主动赋予过一次后,该应用就一直具有该权限,除非在应用管理中撤销
  if (hasReadContactsPermission != PackageManager.PERMISSION_GRANTED) {
   //没有权限,则需要申请权限

   //当用户选择“拒绝权限申请,并不再提示”后,仍可能点击该按键
   //因此需要弹出提示框,提醒用户该功能需要权限
   //这就要用到shouldShowRequestPermissionRationale方法
   if (!shouldShowRequestPermissionRationale(android.Manifest.permission.READ_CONTACTS)) {
    showMessageOKCancel("You need to allow access to Contacts",
     new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
       //仍调用兼容库中的方法,申请权限
       requestPermissions(
        new String[] {Manifest.permission.READ_CONTACTS},
        ASK_READ_CONTACTS_PERMISSION);
       }
      });
    return;
   }

   requestPermissions(new String[] {Manifest.permission.READ_CONTACTS},
     ASK_READ_CONTACTS_PERMISSION);

   return;
  }

  //有权限则直接获取电话号码,并拨号
  getPhoneNumberAndDial();
 }
});
................

private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
 new AlertDialog.Builder(getContext())
  .setMessage(message)
  .setPositiveButton("OK", okListener)
  .setNegativeButton("Cancel", null)
  .create()
  .show();
}

4、处理权限申请结果

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
 switch (requestCode) {
  case ASK_READ_CONTACTS_PERMISSION:
   //由于只申请了一个权限,因此grantResults[0]就是对应权限的申请结果
   if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
     //权限申请成功,则可以获取电话号码并拨号
     getPhoneNumberAndDial();
   } else {
    Toast.makeText(getContext(),
      "READ_CONTACTS Denied",
      Toast.LENGTH_SHORT)
      .show();
   }
   return;
  default:
   super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 }
}

这个地方需要注意的是:

1)、如果不使用兼容库中的Fragment,那么onRequestPermissionsResult必须定义在包含该Fragment的Activity中,才能保证被调用。

2)、如果用户点击过“拒绝权限申请,并不再提示”类似的按键后,再次申请权限的结果将一直是DENIED。
此时,必须进入设置中的应用管理,开启运行时权限。

5、查询电话号码并拨号

private void getPhoneNumberAndDial() {
 //根据之前获取到的contactId,得到CommonDataKinds.Phone表中的信息
 Cursor c = getActivity().getContentResolver().query(
   ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
   null,
   ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
   new String[] {mCrime.getContactId()},
   null);

 if (c == null) {
  return;
 }

 try {
  if (c.getCount() != 0) {
   c.moveToFirst();

   //得到Phone Number对应的indexId
   int index = c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);

   //得到phone Number
   String number = c.getString(index);

   Uri realNumber = Uri.parse("tel: " + number);
   //ACTION_DIAL拉起拨号盘拨号,或利用ACTION_CALL直接拨号
   Intent i = new Intent(Intent.ACTION_DIAL);
   i.setData(realNumber);
   startActivity(i);
  } else {
   Toast.makeText(getContext(), "choose contact again", Toast.LENGTH_LONG).show();
  }
 } finally {
  c.close();
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android利用ContentResolver访问者获取手机联系人信息

    利用ContentResolver内容访问者,获取手机联系人信息我做了两种不同的做法.第一种,直接获取所有手机联系人信息,展示在ListView中.第二种,通过Butten按钮跳转到系统的手机联系人界面,单个获取手机联系人信息,展示在ListView中,结果如下: 第一种: 第二种: 第一种:直接获取所有手机联系人信息 首先需要在AndroidManifest.xml文件中添加权限: <uses-permission android:name="android.permission.REA

  • Android ContentProvider实现获取手机联系人功能

    在之前项目中有用到关于获取手机联系人的部分,闲置就想和大家分享一下,话不多说,上代码: java部分: package com.example.content; import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle

  • Android仿微信联系人列表字母侧滑控件

    仿微信联系人列表字母侧滑控件, 侧滑控件参考了以下博客: Android实现ListView的A-Z字母排序和过滤搜索功能 首先分析一下字母侧滑控件应该如何实现,根据侧滑控件的高度和字母的数量来平均计算每个字母应该占据的高度. 在View的onDraw()方法下绘制每一个字母 protected void onDraw(Canvas canvas) { super.onDraw(canvas); int height = getHeight();// 获取对应高度 int width = get

  • Android跳转到系统联系人及拨号或短信界面

    现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 1.跳转到拨号界面,代码如下:  1)直接拨打 Intent intentPhone = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)); startActivity(intentPhone); 2)跳转到拨号界面 Intent intent = newIntent(Intent.ACTION_DIAL,Uri.pa

  • android如何获取联系人所有信息

    只要是开发和手机通讯录有关的应用,总要学会获取联系人信息,每次都google很麻烦,怎么办? 写一个工具类,获取到通讯录里所有的信息并分好类,至于大家怎么用就不管了,看下代码就都明白了,虽然代码很多,但是很简单,大部分都已分类,如果有没有写上的,大家可以打开自己手机上通讯录数据库,里面的字段都有标明,用的内容提供者,因此我们只需要拿到那个字段名基本上就能取出数据了. 工具类: package com.example.test; import java.util.ArrayList; import

  • Android保存联系人到通讯录的方法

    上一篇文章讲了如何获取所有联系人,这篇文章就讲下怎么保存联系人数据到本机通讯录.这里我就假设你已经拿到了要保存的联系人数据. 因为是一个工具类,所以我这里就只给一个方法了,也是很简单,但是写的没有读取联系人的数据那么多,要保存更多其实看下如何读取的就会了. 直接上源码: /** * 添加联系人到本机 * * @param context * @param contact * @return */ public static boolean addContact(Context context,

  • Android编程实现通讯录中联系人的读取,查询,添加功能示例

    本文实例讲述了Android编程实现通讯录中联系人的读取,查询,添加功能.分享给大家供大家参考,具体如下: 先加二个读和写权限: <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> 具体代码: package com.ebo

  • Android获取手机联系人的方法

    Android 获取系统联系人信息的实例 一.获取手机联系人姓名及手机号 //跳转到系统联系人应用 Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); try { startActivityForResult(intent, Contacts1RequestCode); } catch (Exception e) { LogManager.e("打开联系人信息失败"

  • Android实现获取联系人电话号码功能

    本篇文档主要记录一下获取联系人的电话号码的一种方式. 1.选择联系人 ............ //构造一个隐式的Intent,拉起联系人界面 final Intent pickIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); mSuspectButton = (Button)v.findViewById(R.id.crime_suspect); mSuspectButton.setOn

  • android ContentResolver获取手机电话号码和短信内容

    通过ContentResolver 获取到手机的联系人跟手机短信信息并显示出来,供大家参考,具体内容如下 1.实现的代码: package com.example.phone; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; impo

  • Android实现获取验证码倒计时功能

    本文实例为大家分享了android获取验证码倒计时功能的具体代码,供大家参考,具体内容如下 获取验证码倒计时在现在的App中非常常见,他主要的功能点就是给TextView设置一个点击事件,但是当点击后或出现倒计时,在倒计时的时候点击是触发不了点击事件的. 等倒计时结束显示重新获取验证码的时候可以重新触发点击事件: 在真实的项目中一般都是设置一分钟,咱们这里就不设置那么长了,设置10秒: 首先说下我这个demo非常简单,工具类不用管,直接复制到项目中,只需要两步两行代码即可: 第一步:初始化工具类

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

    前面的文章已经实现相关的布局,本文接着进行相关的功能实现 读取系统联系人 当点击"选择联系人"按钮后,弹出联系人列表,读取系统联系人分如下几个步骤: 系统联系人提供了一个内容提供者,通过内容解析器,匹配Url地址 1.内容解析器 2.Url地址,查看系统联系人数据库,内容提供者源码 先看api文档的清单文件,后看java类(联系人数据库有多张表) contents://com.android.contacts/表名 3.系统联系人数据库中核心表的表结构 raw_contacts 联系人

  • Android获取手机联系人电话号码并返回结果

    之前做了一个小练习需要用到获取手机里联系人的电话号码,通过查阅相关的资料,自己尝试写了一个小例子,可以成功获取. 首先需要在AndroidManifest.xml中获取权限 <uses-permission android:name="android.permission.READ_CONTACTS"/> xml布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro

  • Android获取联系人姓名和电话代码

    在开发中往往有要获取联系人列表的功能,但是这次却不是获取联系人列表,而是在联系人列表点击单个联系人,获取单个联系人的姓名和电话,并设置在指定的输入框内,方便用户的使用:以下是实现的代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:la

  • Android ContentProvider获取手机联系人实例

    在做项目的时候,因为要用到我们自动获取联系人的姓名和电话,就想到了ContentProvider分享数据的功能,这样做既节省了时间,也减少了我们输入错误号码的几率,所以,想在这里把小demo分享给大家,方便以后要用的时候可以看看 我们先看下获取所有联系人的方式,把所有联系人展示在listView上 public void getLinkMan(View view){ //获取联系人 Uri uri=Uri.parse("content://com.android.contacts/raw_con

  • Android编程操作联系人的方法(查询,获取,添加等)

    本文实例讲述了Android编程操作联系人的方法.分享给大家供大家参考,具体如下: Android系统中的联系人也是通过ContentProvider来对外提供数据的,我们这里实现获取所有联系人.通过电话号码获取联系人.添加联系人.使用事务添加联系人. 获取所有联系人 1. Android系统中的联系人也是通过ContentProvider来对外提供数据的 2. 数据库路径为:/data/data/com.android.providers.contacts/database/contacts2

  • Android API开发之SMS短信服务处理和获取联系人的方法

    本文实例讲述了Android API开发之SMS短信服务处理和获取联系人的方法.分享给大家供大家参考,具体如下: Android API支持开发可以发送和接收SMS消息的应用程序.目前我们开发过程中使用的Android模拟器还不支持发送SMS,但它可以接收SMS.现在我们来探索一下Android对SMS的支持,我们将会构建一个小小的应用程序来监听移动设备(或模拟器)上接收到的SMS消息,并将它显示出来. 我们来定义一个Intent接收器来处理SMS接收事件: package com.wissen

随机推荐