简而言之,在MX5(android版本5.1,Flyme 6.2.0.0A版本)手机上通过Intent跳转到手机通讯录选择联系人,通讯录显示正常,但是在onActivityResult中一直无法取到数据。第一想到的肯定是权限问题,但是动态权限是android6.0才出现的,所以5.1应该是无需动态申请的,到系统设置中看了下通讯录权限的状态是处于询问状态。
原因:不知道为什么魅族在跳转到通讯录界面的时候是不需要询问权限的,但是在取通讯录数据的时候却需要权限。使用android6.0的权限请求方式无效,后来经过百度发现有一篇文章说只需要调用getContentResolver().query()就行。原文地址:android读取通讯录联系人问题 - CSDN博客,但是在onActivityResult中调用该方法并没有出现请求权限的对话框,于是mmp了。再后来将该方法直接放在用户点击事件中发现请求权限的对话框出现了,真的是哔了狗了。
解决方法:综上所述该问题的解决方法就是在用户点击事件中调用getContentResolver().query()方法即可。
题外话:在网上跳转到手机通讯录中选择联系人的文档很多,但是要注意Intent intent =new Intent(action,uri);中的uri与onActivityResult中返回的Uri是对应的,因此在查询手机号时不要把表给搞混了。就比如ContactsContract.CommonDataKinds.Phone.CONTENT_URI对应的是content://com.android.contacts/data/phones,而ContactsContract.Contacts.CONTENT_URI对应的则是content://com.android.contacts/contacts。简单地说就是不同的uri进去的通讯录取到的联系人id是不一样的。
最后,附上一段代码
跳转到通讯录:
在onActivityResult中取得联系人电话和姓名
如果是6.0以下版本的最好在跳转之前添加一下getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null)。