源码中的注意点即:电信运营商给你的号码可能是+86开头的,这个时候去与通讯录中库中的数据匹配,如果不做模糊匹配是不行的,而一些号码更是有‘-’在数字中间。

/** * This service essentially plays the role of a "worker thread", allowing us to * store incoming messages to the database, update notifications, etc. without * blocking the main thread that SmsReceiver runs on. */public class SmsReceiverService extends Service

private void handleSmsReceived(Intent intent) {SmsMessage[] msgs = Intents.getMessagesFromIntent(intent);Log.i(TAG, "------ msgs.length() -------" + msgs.length);Uri messageUri = insertMessage(this, msgs);if (messageUri != null) {//MessagingNotification.updateNewMessageIndicator(this, true);MessagingNotification.updateNewMessageIndicatorandNotifyLac(this, true);}voicePrompt(msgs);}

private synchronized void voicePrompt(SmsMessage[] msgs){Log.d(TAG, "Coming SMS, suggesting the need for reading");strRead = new StringBuffer();SmsMessage msg = msgs[0];if (msg != null){String address = msg.getOriginatingAddress();Log.d(TAG, "======Phone Number:" + address + "======" );if (!TextUtils.isEmpty(address)){forEachContact(SmsReceiverService.this);String name = getContactsNameByNumber(SmsReceiverService.this, address);if (!TextUtils.isEmpty(name)){strRead.append(name);}else{String prefix = "+86";int index = address.indexOf(prefix);if (index != -1){address =   address.substring(index + prefix.length()  )  ;}String nameAgain = getContactsNameByNumber(SmsReceiverService.this, address);if (!TextUtils.isEmpty(nameAgain)){strRead.append(nameAgain);}else {address = address.replace("+86", "");String fuzzyMatchingName = getContactNumber(SmsReceiverService.this,address);if(!TextUtils.isEmpty(fuzzyMatchingName)){strRead.append(fuzzyMatchingName);}else{strRead.append(getResources().getString(R.string.phone_num)  + "[r1][n1]"+ address + "[r0][n0]");}}}}else {Log.d(TAG, "address is empty");}}msgget = Message.obtain();msgget.what = 1;handler.sendMessageDelayed(msgget, 1000);}

private synchronized String getContactsNameByNumber(Context context, String number){Log.d(TAG, "look for contact name by number");ContentResolver cr = context.getContentResolver();Cursor cursor = cr.query(Contacts.Phones.CONTENT_URI, new String[] { Contacts.Phones.NAME }, Contacts.Phones.NUMBER + " = ?",new String[] { number }, null);if (cursor != null){int count = cursor.getCount();if (count > 0){if (cursor.moveToFirst()){do{String name = cursor.getString(cursor.getColumnIndex(Contacts.Phones.NAME));Log.d(TAG, "find name : " + name );if (name != null){return name;}}while (cursor.moveToNext());}}}return null;}

更多相关文章

  1. [Android]Fragment源码分析(二) 状态
  2. 序列化原理(二):从源码理解Parcelable
  3. android 手势识别代码
  4. Android(安卓)实现音乐播放器【源码+注释】— MediaPlayer
  5. Android(安卓)源码的建造者模式
  6. [置顶] Android中一些优秀的博文(看过的)
  7. Android(安卓)炫酷的自定义进度条ProgressBar集锦,优雅呈现
  8. android Content Provider 共享数据库
  9. Android(安卓)Handler内存泄露分析

随机推荐

  1. android app --- 快速集成SharaSDK ,SMS实
  2. Android视频录制并转GIF格式
  3. Android应用程序拍照行为C层拦截实现
  4. Android开发——记账App开发项目分享(一)之
  5. [android]android Task 任务 简介
  6. Android AccessibilityService(辅助服务)学
  7. Android应用系列:仿MIUI的Toast动画效果实
  8. Android内存泄漏
  9. [置顶] android自动化测试之Benckmark
  10. Android推荐学习路线图,职业规划