现在的位置: 首页 > 综合 > 正文

android开发步步为营之19:选取手机通讯录中的联系人

2017年10月06日 ⁄ 综合 ⁄ 共 4597字 ⁄ 字号 评论关闭

一、需求
最近开发的一个应用中,给手机中的好友转账,那么需要选择用户手机中的联系人,作为收款账号。先看看效果:
1、主界面


2、点击收款账号右边的图标按钮之后,跳到手机联系人页面

3、选取联系人之后

二、理论知识
作为一个完成的应用程序,数据存储操作是必不可少的。因此,Android系统一共提供了四种数据存储方式。分别是:SharePreference、SQLite、Content Provider和File。由于Android系统中,数据基本都是私有的的,都是存放于“data/data/程序包名”目录下,所以要实现数据共享,正确方式是使用Content Provider。
 
  SQLite: SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式。Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的API。
 
  SharedPreference: 除SQLite数据库外,另一种常用的数据存储方式,其本质就是一个xml文件,常用于存储较简单的参数设置。
 
  File: 即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。
 
  ContentProvider: Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个Content Provider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用Content Provider为这些数据定义一个URI,然后其他的应用程序就通过Content Provider传入这个URI来对数据进行操作。
 
         PS: URI由3个部分组成:"content://"、数据的路径、标识ID(可选)。
    比如选择联系人手机号码的uri是:content://com.android.contacts/data/phones
 
三、代码实现
 好,现在,我们来看看如何实现。其实比较简单
第一步、给按钮注册事件
// 选择联系人
       contactBtn.setOnClickListener(new OnClickListener() {
           @Override
           public void onClick(View v) {
              // 从手机联系人选择
              Intent intent = new Intent(Intent.ACTION_PICK,
                     android.provider.ContactsContract.Contacts.CONTENT_URI);
              startActivityForResult(intent, REQ_CODE);
           }
       });
第二步、选取好联系人之后,转账主页面在onActivityResult获取返回的结果
// 获取activiy返回结果
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       // TODO Auto-generated method stub
       super.onActivityResult(requestCode, resultCode, data);
       //得到选中的联系人数据
       Cursor c = null;
       switch (requestCode) {
       case REQ_CODE:
           if (data == null) {
              return;
           }
 
           try {
              if (data != null) {
                  //我们可以发现联系人数据是通过Content Provider来共享给所有的应用的
                  c = getContentResolver().query(data.getData(), null, null,
                         null, null);
              }
              if (c != null) {
                  c.moveToFirst();
                  //获取联系人编号
                  int contactId = c.getInt(c
                         .getColumnIndex(ContactsContract.Contacts._ID));
                    //通过联系人编号获取联系人手机号码、姓名等等资料
                  Cursor phones = getContentResolver().query(
                         ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                         null,
                         ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                + " = " + contactId, null, null);
                  String strPhoneNum = null;
                  String strPhoneName = null;
                  if (phones.getCount() > 0) {
                     // phones.moveToFirst();
                     for (int i = 0; i < phones.getCount(); i++) {
                         phones.moveToPosition(i);
                         //得到手机号码
                         String tmpPhoneNum = phones
                                .getString(phones
                                       .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                         //得到联系人姓名
                         String tmpPhoneName = phones
                                .getString(phones
                                       .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                         if (tmpPhoneNum != null) {
                            String valStr = tmpPhoneNum.replace("+86", "")
                                   .replaceAll("-", "");
                            if (StringUtil.isMobile(valStr)
                                   || i == phones.getCount() - 1) {
                                strPhoneNum = tmpPhoneNum;
                                strPhoneName = tmpPhoneName;
                                break;
                            }
                         }
                     }
                     phones.close();// 记得关闭
                  }
                  if (strPhoneNum == null || strPhoneNum.equals("null")) {
                     strPhoneNum = "";
                  }
 
                  String phoneNum = strPhoneNum;
                  phoneNum = phoneNum.replace("+86", "").replaceAll("-", "");
                  String showTxt = phoneNum;
                  if (strPhoneName != null) {
                     strPhoneName = strPhoneName.replace("+86", "")
                            .replaceAll("-", "");
                     if (!strPhoneName.equals(phoneNum)) {
                         showTxt = showTxt + "(" + strPhoneName + ")";
                     }
 
                  }
                  //显示格式:手机号码+(姓名)
                  transferAccountEdit.setText(showTxt);
                  transferAccountEdit.setSelection(showTxt.length());
                  c.close();
              }
           } catch (Exception e) {
              e.getMessage();
           }
 
           break;
       default:
           break;
       }
    }

抱歉!评论已关闭.