android通讯录浅谈
来源:互联网 发布:手绘图片是什么软件 编辑:程序博客网 时间:2024/06/05 19:27
关于Android通讯录,因为各个android版本的不同,大大小小的坑实在太多了。。。
最近,项目中遇到一个很蛋疼的问题,自己不管怎么测,都OK,拿到客户那边,分分钟就Crash.......根据Crash Log来看 是 下标越界所致,Crash Log 如下所示
java.lang.StringIndexOutOfBoundsException: length=0; index=0at java.lang.String.charAt(Native Method)
找了N久。。。因为,我初始化的时候,内容比较多。。更开始没有从这方面查找。。 但是charAt得这个方法。。。最后定位到联系人这一块,因为,其他的模块虽然也用到了这个方法,但都一一排除了。
有误代码如下:
if (android.os.Build.VERSION.SDK_INT >= 19) { PHONES_PROJECTION[PHONES_SORT_KEY_ALTERNATIVE] = "phonebook_label"; }Cursor cur = context.getContentResolver().query(Phone.CONTENT_URI, PHONES_PROJECTION, null, null, null); if(cur!=null){while(cur.moveToNext()){String number = cur.getString(PHONES_NUMBER_INDEX);if (TextUtils.isEmpty(number)) continue;String contactName = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));String sortKey = cur.getString(PHONES_SORT_KEY_ALTERNATIVE);addContact(Contact,contactName,"Mobile","Today","0",number,sortKey.trim().charAt(0)+"");}这样写,一般的存储习惯可以,不打长途国际家区号可以。。但是!如果联系人姓名,如果有#¥@%……&*之类的符号,那就分分钟Crash.....当时,确实自己都是按照一般的习惯操作的。。。没有进行其他的测试。。蛋疼。。测试也没有这样搞。。。就简单的以为OK了。。。 如果只是不加后面的 sortKey.trim().charAt(); 方法的话,确实没问题,但是,一般情况,我们都要进行对通讯录的排序吧。。。这个很有必要! 上述崩溃的原因在于 sortKey.trim().charAt();
话不多说,直接用现在的这种方式吧,这种方式,还是有点问题,比如,我用华为一款6.0.1的android以及三星一款4.3系统的手机,排序是没问题,Log,打印出来的信息 sortKey,是包括 中英文,并且英文在前面,这样的话,就可以进行排序,但是小米5手机,竟然遍历出来的只有中文!中文。。。。蛋疼,那就还要中转英再进行排序了。。。android 碎片化态让人无语。。。
代码如下,但是,遇到上面我所说的,并没有进行中英文处理。。。排序这类的东西,如果你要使用,你还是要判断得到的sortKey是否有英文开头。。。中英转换就不多说了。。
private String getSortKeyString(long rawContactId) {String Where = ContactsContract.RawContacts.CONTACT_ID + " ="+ rawContactId;String[] projection = { "sort_key" };Cursor cur = context.getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, projection, Where,null, null);int sortIndex = cur.getColumnIndex("sort_key");cur.moveToFirst();String sortValue = cur.getString(sortIndex);cur.close();return sortValue;}
if (android.os.Build.VERSION.SDK_INT >= 19) { PHONES_PROJECTION[PHONES_SORT_KEY_ALTERNATIVE] = "phonebook_label"; }Cursor cur = context.getContentResolver().query(Phone.CONTENT_URI, PHONES_PROJECTION, null, null, null); if(cur!=null){while(cur.moveToNext()){int phoneNumberIndex = cur.getColumnIndex(Phone.NUMBER);String number = cur.getString(phoneNumberIndex);if (TextUtils.isEmpty(number))continue;int contactNameIndex = cur.getColumnIndex(Phone.DISPLAY_NAME);String contactName = cur.getString(contactNameIndex);int rawContactIdIndex = cur.getColumnIndex(Phone.CONTACT_ID);Long rawContactId = cur.getLong(rawContactIdIndex);String sortKey = getSortKeyString(rawContactId);Log.e("sortKey",""+sortKey);addContact(Contact,contactName,"Mobile","Today","0",number,sortKey.trim().charAt(0)+"");}}
就写这么多了 欢迎各种补充,或者有更好方式的 可以留言给我
马上不知不觉一年马上就要过去了。。。20161125
0 0
- android通讯录浅谈
- android 通讯录
- Android通讯录
- android通讯录
- Android通讯录
- Android 通讯录
- Android 通讯录
- android通讯录
- android读取通讯录和写入通讯录
- [通讯录] android通讯录数据库表解析和添加,访问通讯录
- Android通讯录同步
- Android SDK2.0 通讯录
- android获取通讯录信息
- 高仿android通讯录
- android操作手机通讯录
- android 通讯录跳转
- 关于android通讯录
- android删除通讯录机制
- frame访问、设置简化
- 团队在Github上协同开发项目流程
- 发送E-mail
- 初入代码的领域,打开编程的大门
- 责任链模式/过滤器模式
- android通讯录浅谈
- 得到地址栏地址和简单的截取有效数据示例代码
- java并发编程---wait、notify
- 如何搭建一台深度学习服务器
- 并发程序设计模式之Future模式
- SOL第十一章上机题1-5
- Lua 条件语句
- python ddt 数据驱动测试
- 数据结构——树的概述