在Android Studio上实现基于Android6.0的通讯录获取功能

1、新建一个Android项目,API选择23: Android6.0(Marshmallow)

2、在MainActivity的layout中添加一个button用于获取通信录功能

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="获取联系人信息"

android:id="@+id/btnGetContacts"

android:layout_below="@+id/textView"

android:layout_alignParentStart="true"/>

3、为了后续开发的方便和规整,新建一个包Contacts用于存放获取通讯录所需的类。并在包中新建一个Activity:GetContacts。

由于Android6.0对APP运行权限做了较大改变,获取通讯录信息不仅需要静态授权还需要动态申请权限,详情见

Android6.0系统权限那些事

http://www.open-open.com/lib/view/open1450578678148.html

Android 6.0 运行时权限处理完全解析

http://www.w2bc.com/article/101798?from=extend

所以在这里需要给APP添加动态申请权限代码,暂时先将其实现,下一篇博客再考虑封装。新建一个String类型的方法getContacts(Context context),第一步检查是否授权,如果没有授权就申请权限

if (ContextCompat.checkSelfPermission(context,android.Manifest.permission.READ_CONTACTS)

!=PackageManager.PERMISSION_GRANTED) {

ActivityCompat.requestPermissions((Activity) context,

new String[]{android.Manifest.permission.READ_CONTACTS},

1);

}

这里涉及到的API:

ContextCompat.checkSelfPermission,主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了。

ActivityCompat.requestPermissions,该方法是异步的,第一个参数是Context;第二个参数是需要申请的权限的字符串数组;第三个参数为requestCode,主要用于回调的时候检测。可以从方法名requestPermissions以及第二个参数看出,是支持一次性申请多个权限的,系统会通过对话框逐一询问用户是否授权。

注:这里暂时没有考虑权限申请回调onRequestPermissionsResult()方法,只是为了跑通该程序,在下一篇博客再具体分析关于权限的事儿。

4、授权成功后,开始执行获取通讯录功能:

在写具体代码前,先新建一个类:ContactsInfo用于通讯录的数据封装。定义需要获取到的通讯录信息字符串,并写好构造函数。

public class ContactsInfo {

private String name;

private String number;

private String sortKey;

private int id;

public ContactsInfo(String name,String number,String sortKey,int id){

setName(name);

setNumber(number);

setSortKey(sortKey);

setId(id);

}

定义一个ContactsInfo类型的List用于保存数据:public static List list = new ArrayList();

然后再开始写具体功能:

else {

try {

Uri contactUri =ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

Cursor cursor = context.getContentResolver().query(contactUri,

new String[]{"display_name", "sort_key", "contact_id","data1"},

null, null, "sort_key");

String contactName;

String contactNumber;

String contactSortKey;

int contactId;

while (cursor.moveToNext()) {

contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

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

contactId = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));

contactSortKey =getSortkey(cursor.getString(1));

ContactsInfo contactsInfo = new ContactsInfo(contactName,contactNumber,contactSortKey,contactId);

if (contactName!=null)

list.add(contactsInfo);

}

cursor.close();//使用完后一定要将cursor关闭,不然会造成内存泄露等问题

}catch (Exception e){

e.printStackTrace();

}finally {

context = null;

}

这里使用了sort_key对获取到的通讯录信息进行了排序,实现一个方法:

private static String getSortkey(String sortKeyString){

String key =sortKeyString.substring(0,1).toUpperCase();

if (key.matches("[A-Z]")){

return key;

}else

return "#"; //获取sort key的首个字符,如果是英文字母就直接返回,否则返回#。

}

5、实现了基本功能后,我们需要将获取到的数据展示在界面上。

在GetContacts的layout中添加一张ListView

android:layout_height="wrap_content"

android:id="@+id/ContactsLv"

android:layout_weight="1"/>

之后需要自定义一个adapter用于对ListView的数据传递。新建一个类:ContactsAdapter 扩展自BaseAdapter,新建一个contacts布局来展示该adapter的界面,并重构其四个方法:

public class ContactsAdapter extends BaseAdapter{

private List list;

private Context context;

public ContactsAdapter(List list,Context context){

this.list = list;

this.context = context;

}

@Override

public int getCount() {

return list.size();

}

@Override

public Object getItem(int position) {

return list.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder;

if(convertView == null){

convertView =LayoutInflater.from(context).inflate(R.layout.contacts,null);

holder = new ViewHolder();

holder.nametv = (TextView) convertView.findViewById(R.id.contactName);

holder.numbertv = (TextView) convertView.findViewById(R.id.contactNumber);

holder.nametv.setText(list.get(position).getName());

holder.numbertv.setText(list.get(position).getNumber());

convertView.setTag(holder);

}else {

holder = (ViewHolder) convertView.getTag();

holder.nametv.setText(list.get(position).getName());

holder.numbertv.setText(list.get(position).getNumber());

}

return convertView;

}

private static class ViewHolder{

TextView nametv;

TextView numbertv;

}

}

/**

* ViewHolder就是一个持有者的类,他里面一般没有方法,只有属性,作用就是一个临时的储存器,

* getView方法中每次返回的View存起来,可以下次再用。

* 这样做的好处就是不必每次都到布局文件中去拿到你的View,提高了效率。

*/

这里使用了ViewHolder来对listvier进行优化

6、在GetContacts活动中将ListView与ContactsAdapter进行绑定:

private ListView ContactsLv;

private ContactsAdapter adapter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.content_get_contacts);

GetContacts.getContacts(this);

ContactsLv = (ListView) findViewById(R.id.ContactsLv);

adapter = new ContactsAdapter(list, this);

ContactsLv.setAdapter(adapter);

}

另外,需要对list清除缓存,不然每一次运行都会重复加载数据:

@Override

public void onBackPressed() { //清除缓存

list.clear();

super.onBackPressed();

}

7、OK,大功告成~~在MainActvity中增加对Button的监听即可。

android+6.0+通讯录,Android6.0的通讯录获取相关推荐

  1. android launcher 字体大小,Android6.0 Launcher3 修改app字体大小

    在原生的Android6.0中,在修改了系统字体大小后,Launcher 3上的app字体大小没有改变,下面方法可以解决:--- a/packages/apps/Launcher3/src/com/a ...

  2. android 相机拍照返回,Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题...

    版权声明:本文为博主原创文章,未经博主允许不得转载. 正常情况下调用系统相机拍照: 如果拍照后点击的是"确定"图标,返回的resultCode = -1(Activity.RESU ...

  3. [Android Studio]详细讲解Android6.0以上请求应用权限(解决请求权限窗口一闪而过的问题)

    现在的主流手机的Android版本都是8.0/9.0(笔者的华为手机为9.0),所以在开发Android的时候尽量使用Android8.0的版本(SDK 26).随着Android版本的提升,系统的安 ...

  4. android禁止压缩壁纸,Android6.0 屏蔽壁纸功能

    软件平台:android6.0 硬件平台:MT6797 这两天搞了一个定制需求,也算是一个bug吧,6.0的系统前阵子做了系统裁剪,去掉了几十个app和service,结果一开始没出现的问题,裁剪后出 ...

  5. android关闭权限管理,Android6.0权限管理以及使用权限该注意的地方

    Android 6.0 Marshmallow首次增加了执行时权限管理,这对用户来说,能够更好的了解.控 制 app 涉及到的权限.然而对开发人员来说却是一件比較蛋疼的事情.须要兼容适配,并保证程序功 ...

  6. imx6 android 最新,Re: IMX6D Android6.0 OTA 升级问题

    HI All : 在调试我们imx6D Android6.0产品OTA升级的时候遇到一个问题,希望您帮忙协助分析下. 现在我们的板子是通过SD卡启动,系统运行正常. 操作如下: 我通过Make dis ...

  7. moto x android 6.0,摩托罗拉Android6.0升级名单公布 Moto E系列和第一代Moto X被抛弃

    前瞻科技快讯,在继三星和HTC之后,摩托罗拉也公布旗下产品中中可升级Android6.0的名单,很遗憾的时第一代Moto X手机和MotoE系列全部不在升级序列,另外部分版本的Moto X二代也不能升 ...

  8. android6.0 工具包,Android6.0以上安装安装包

    Android6.0以下 public static void installNewPackage(Context context, String path) { if (StringUtils.is ...

  9. android apk旋转,[RK3288][Android6.0] Apk设置显示旋转过程小结

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 setRequestedOrientation -> Activity.java Activ ...

最新文章

  1. 10大NLP精选项目-涉及预训练Bert、知识图谱、智能问答、机器翻译、对话等
  2. java实现续打功能_浅谈报表工具的打印方案
  3. 最近一次.Dragon4444勒索病毒的成功解密过程
  4. 别再无聊地吹捧了,一起来动手实现MAE玩玩吧!
  5. 讲讲Linq to SQL映射(基础篇)
  6. CDN架构以及原理分析
  7. Android TextView 带背景的文字垂直方向显示(ems属性)
  8. linux arm fpu初始化,ARM处理器的浮点运算单元(FPU)
  9. 基于jQuery动画二级下拉导航菜单
  10. 旋转矩阵中6保6_双色球旋转矩阵公式中6保4的
  11. Mysql的用户与权限管理
  12. 【深度学习】初次接触
  13. 颜色模型和颜色应用---YIQ颜色模型
  14. 计算机怎么建我的文档,如何修改我的文档路径
  15. 2022-2028全球沉浸式投影行业调研及趋势分析报告
  16. 小米手机通过USB连接MAC电脑
  17. Nginx proxy_pass指令(代理配置)
  18. 使用Excel 表示汽车、摩托车10年免检时间、非常清晰。
  19. 如何计算近似纳什均衡_纳什-纳什解(Nash-in-Nash Solution)简介
  20. 迅雷文件创建失败无法下载

热门文章

  1. JAVA整合腾讯COS(拿来即用)
  2. 象棋机器人 1 数据分析收集-爬虫编写
  3. 算法打卡Day16_leetcode _94. 二叉树的中序遍历
  4. 云服务器可以修改ip,云服务器的ip可以更换吗
  5. MakerDAO亚洲区负责人王奇君:我的DAI很稳!
  6. Kindle开箱测评以及使用体验
  7. MEMS硅麦和ECM驻极体麦
  8. 优秀的 Android 开源项目
  9. 只是为了好玩:linux之父林纳斯自传.pdf,读后感:《只是为了好玩:Linux之父林纳斯自传》...
  10. Apache Flink fault tolerance源码剖析(六)