//6.0 以上开启,和添加的方法我都测试过了

//如果联系人Map不包含该contactId

 

}

intcontactId = contactsCursor.getInt;

图片 1

private static final String EMAIL_TYPE = ContactsContract.CommonDataKinds.Email.TYPE;

.CommonDataKinds.Phone.NUMBER));

  1. package zhangphil.contacts;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.ListActivity;  
  6. import android.content.ContentResolver;  
  7. import android.content.Context;  
  8. import android.database.Cursor;  
  9. import android.net.Uri;  
  10. import android.os.Bundle;  
  11. import android.provider.ContactsContract;  
  12. import android.view.LayoutInflater;  
  13. import android.view.View;  
  14. import android.view.ViewGroup;  
  15. import android.widget.ArrayAdapter;  
  16. import android.widget.ListView;  
  17. import android.widget.TextView;  
  18.   
  19. public class MainActivity extends ListActivity {  
  20.   
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.   
  25.         ArrayList<Contact> contacts = new ArrayList<Contact>();  
  26.         readContacts(contacts);  
  27.   
  28.         ListView listView = this.getListView();  
  29.         ArrayAdapter<Contact> adapter = new MyAdapter(this,  
  30.                 android.R.layout.simple_list_item_2, contacts);  
  31.         listView.setAdapter(adapter);  
  32.     }  
  33.   
  34.     private class MyAdapter extends ArrayAdapter<Contact> {  
  35.   
  36.         private int resource;  
  37.         private LayoutInflater inflater = null;  
  38.         private ArrayList<Contact> contacts;  
  39.   
  40.         public MyAdapter(Context context, int resource,  
  41.                 ArrayList<Contact> contacts) {  
  42.             super(context, resource);  
  43.             this.resource = resource;  
  44.             this.contacts = contacts;  
  45.   
  46.             inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  47.         }  
  48.   
  49.         @Override  
  50.         public View getView(int position, View convertView, ViewGroup parent) {  
  51.   
  52.             if (convertView == null)  
  53.                 convertView = inflater.inflate(resource, null);  
  54.   
  55.             Contact c = getItem(position);  
  56.   
  57.             TextView text1 = (TextView) convertView  
  58.                     .findViewById(android.R.id.text1);  
  59.             TextView text2 = (TextView) convertView  
  60.                     .findViewById(android.R.id.text2);  
  61.   
  62.             //首字符,分组的依据。  
  63.             text1.setText(c.firstLetterOfName());  
  64.               
  65.             //详情。  
  66.             text2.setText(c.name + " " + c.getPhoneNumbers());  
  67.   
  68.             return convertView;  
  69.         }  
  70.   
  71.         @Override  
  72.         public Contact getItem(int pos) {  
  73.             return contacts.get(pos);  
  74.         }  
  75.   
  76.         @Override  
  77.         public int getCount() {  
  78.             return contacts.size();  
  79.         }  
  80.     }  
  81.   
  82.     // 读取设备联系人的一般方法。大致流程就是这样,模板化的操作代码。  
  83.     private void readContacts(ArrayList<Contact> contacts) {  
  84.         Uri uri = Uri.parse("content://com.android.contacts/contacts");  
  85.         ContentResolver reslover = this.getContentResolver();  
  86.   
  87.         // 在这里我们给query传递进去一个SORT_KEY_PRIMARY。  
  88.         // 告诉ContentResolver获得的结果安装联系人名字的首字母有序排列。  
  89.         Cursor cursor = reslover.query(uri, null, null, null,  
  90.                 android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY);  
  91.   
  92.         while (cursor.moveToNext()) {  
  93.   
  94.             // 联系人ID  
  95.             String id = cursor  
  96.                     .getString(cursor  
  97.                             .getColumnIndex(android.provider.ContactsContract.Contacts._ID));  
  98.   
  99.             // Sort Key,读取的联系人按照姓名从 A->Z 排序分组。  
  100.             String sort_key_primary = cursor  
  101.                     .getString(cursor  
  102.                             .getColumnIndex(android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY));  
  103.   
  104.             // 获得联系人姓名  
  105.             String name = cursor  
  106.                     .getString(cursor  
  107.                             .getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME));  
  108.   
  109.             Contact mContact = new Contact();  
  110.             mContact.id = id;  
  111.             mContact.name = name;  
  112.             mContact.sort_key_primary = sort_key_primary;  
  113.   
  114.             // 获得联系人手机号码  
  115.             Cursor phone = reslover.query(  
  116.                     ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,  
  117.                     ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="  
  118.                             + id, null, null);  
  119.   
  120.             // 取得电话号码(可能存在多个号码)  
  121.             // 因为同一个名字下,用户可能存有一个以上的号,  
  122.             // 遍历。  
  123.             ArrayList<String> phoneNumbers = new ArrayList<String>();  
  124.             while (phone.moveToNext()) {  
  125.                 int phoneFieldColumnIndex = phone  
  126.                         .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);  
  127.                 String phoneNumber = phone.getString(phoneFieldColumnIndex);  
  128.                 phoneNumbers.add(phoneNumber);  
  129.             }  
  130.   
  131.             mContact.phoneNumbers = phoneNumbers;  
  132.   
  133.             contacts.add(mContact);  
  134.         }  
  135.     }  
  136.   
  137.     // 用于装载从联系人数据库中读取到的数据。  
  138.     // 结构化数据,便于数据操作和访问。  
  139.     private class Contact {  
  140.         public String id;  
  141.         public String name;  
  142.         public String sort_key_primary;  
  143.         public ArrayList<String> phoneNumbers;  
  144.           
  145.         //获得一个联系人名字的首字符。  
  146.         //比如一个人的名字叫“安卓”,那么这个人联系人的首字符是:A。  
  147.         public  String  firstLetterOfName(){  
  148.             String s=sort_key_primary.charAt(0)+"";  
  149.             return  s.toUpperCase();  
  150.         }  
  151.   
  152.         public String getPhoneNumbers() {  
  153.             String phones = " ";  
  154.             for (int i = 0; i < phoneNumbers.size(); i++) {  
  155.                 phones += "号码" + i + ":" + phoneNumbers.get(i);  
  156.             }  
  157.   
  158.             return phones;  
  159.         }  
  160.     }  
  161. }  

contactBean.setDisplayName(displayName);

if(targetSdkVersion >= Build.VERSION_CODES.M) {

本文给出了Android读取通讯录联系人的一般方法,且在读取Android通讯录联系人时候,将结果有序化(按照联系人姓名的首字符依次顺序读取:A ~ Z)。

}

// targetSdkVersion < Android M, we have to use PermissionChecker

 

values.put("data2", displayName);

}

读取的结果如图所示:

import android.content.ContentValues;

近日接到一个小需求---读取手机通讯录并分页传给H5。

[html] view plain copy

// 有电话号码,就去电话号码那表中去获取数据就行了!

此处不得不吐槽一下,6.0以下的Android机的适配是个问题,测试了包括锤子5.1.1,小米等手机,6.0以下的机器有询问弹出窗口且点击了拒绝之后,其默认的的权限还是允许的状态。尝试了GitHub上面的AndPermission、TedPermission的开源库后,仍是如此,有些不知所以,有经验的望指教(target 是22,项目中不好改动)。

 

private static final String ACCOUNT_TYPE = ContactsContract.RawContacts.ACCOUNT_TYPE;

// use Context#checkSelfPermission

  1. <!-- 写权限 -->  
  2.    <uses-permission android:name="android.permission.WRITE_CONTACTS" />  
  3.    <!-- 读权限 -->  
  4.    <uses-permission android:name="android.permission.READ_CONTACTS" />  

}

Map contactIdMap =newHashMap<>();

不要忘记在项目的AndroidManifest.xml文件中添加Android读写通讯录联系人的权限:

Cursor emc = resolver.query(EMAIL_URI,null, selection, null, null);

String name = contactsCursor.getString;

[java] view plain copy

先说下bean

targetSdkVersion = info.applicationInfo.targetSdkVersion;

  Android根据联系人姓名首字符顺序读取通讯录

values.put("data1", homePhone);

if(contactIdMap.containsKey(contactId)) {

 

while (phc.moveToNext()) {

Cursor contactsCursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,

版权声明:本文为Zhang Phil原创文章,欢迎转载!转载请注明出处:

values.put("mimetype", "vnd.android.cursor.item/name");

//号码处理

 

values.clear();

//重新设置号码数组

现给出实现该种Android通讯录读取的代码:

//[content://com.android.contacts/contacts]

while(contactsCursor.moveToNext {

contactBean.setEmail(emails);

先贴上开始的代码:

c.close();

2.权限判断

import android.content.OperationApplicationException;

String[] projection =newString[]{

//Log.i(TAG, "phones: " + phones);

}

// 所以以下Phc 中 可以是个集合, 而且我敢肯定每条记录的区别,用phoneType 字段来区分开来!

finalPackageInfo info =this.getPackageManager().getPackageInfo(

// 别忘记了把结合放到contactBean中!

}else{ ... }

emc.close();

private void getPhoneContacts(int start,int size){ //先清空之前的数据 if(list!=null){ list.clear(); }

phones.add(getPhoneTypeNameById(phoneType) + " : " + phoneNumber);

//如果联系人Map不包含该contactId

//[content://com.android.contacts/data]

Uri uri = ContactsContract.Contacts.CONTENT_URI; //获取ContentResolver ContentResolver contentResolver = this.getContentResolver();

// data2数值不同罢了!

ContactsContract.CommonDataKinds.Phone.NUMBER,

switch (typeId) {

returnresult;

// 获取电话号码的数量! 如果有肯定就>0. 如果没有就是0 就不需要去获取了!

phonelist.add(j,phoneNumber);

//[content://com.android.contacts/raw_contacts]

String phoneNumber = phones.getString(phones

values.put("data2", "1");

这个日记告诫自己,简单的问题也要自己实地的分析下,不能简单的复制粘贴了事。

int hasPhoneNumber = c.getInt(c.getColumnIndex(HAS_PHONE_NUMBER));

}

default: return "none";

//获取联系人的ID

values.clear();

ActivityCompat.requestPermissions(BannerActivity.this,newString[]{android.Manifest.permission.READ_CONTACTS},1);

values.put("raw_contact_id", contactId);

// 获取手机联系人

values.put("raw_contact_id", contactId);

//key: contactId,value: 该contactId在联系人集合data的index

private static final int PHONE_TYPE_HOME = ContactsContract.CommonDataKinds.Phone.TYPE_HOME;

}

//获取邮箱

PhoneContactsBean bean = new PhoneContactsBean();

//Log.i(TAG, "emails: " + emails);

String limitOffSet="limit "+start+","+size+"";

}

}

String selection = CONTACT_ID + "=" + _id;  //the 'where' clause

}

import android.os.RemoteException;

//6.0 以上开启

contactBeans.add(contactBean);

// targetSdkVersion >= Android M, we can

import android.content.ContentResolver;

}

ContentValues values = new ContentValues();

  1. 权限部分

values.put("raw_contact_id", contactId);

}else{

case ContactsContract.CommonDataKinds.Phone.TYPE_WORK: return "work";

{

ArrayList phones = new ArrayList();

bean.phoneNumList.add;

import java.util.ArrayList;

//6.0以下判断

ContactBean contactBean = new ContactBean();

cursor.close();

private static final String AUTHORITY = ContactsContract.AUTHORITY;

if(start ==0) {

/* 往 data 中添加数据(要根据前面获取的id号) */

//搜索字段

ContentResolver resolver =context.getContentResolver();

3.读取联系人操作

// 存放单个联系人的集合!

}

// 查找联系人表!

String contactId = cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts._ID)); // 获取联系人的名字 String name = cursor.getString(cursor.getColumnIndex( ContactsContract.Contacts.DISPLAY_NAME));

long contactId = ContentUris.parseId(resolver.insert(uri, values));

ContactsContract.Contacts.DISPLAY_NAME};

values.put("mimetype", "vnd.android.cursor.item/phone_v2");

Cursor phones = mContext.getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null); // 遍历查询结果,获取该联系人的多个电话号码 ArrayListphonelist = new ArrayList();

values.put("data1", email);

本文由美高梅游戏网站登录发布于美高梅棋牌游戏,转载请注明出处://6.0 以上开启,和添加的方法我都测试过了

您可能还会对下面的文章感兴趣: