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
原创粉丝点击