近期三星陆续放出android4.4.2ROM更新包,android4.4.2对短信虽说是放开了权限,但其实是加强了限制,一台手机智能通过一个设置为默认应用的短信应用软件才能发送短信,否则就无法对短信数据库进行操作。
以为只是对这个进行了变更, 认真观察android4.4.2 mms源码完,发现对短信的广播也进行了一些变更,有些厂家为了兼容会继续发送android.provider.Telephony.SMS_RECEIVED广播,但是有些厂家就不厚道了,在android4.4上就发送android.provider.Telephony.SMS_DELIVER广播,因为他只对自带的短信应用负责。
所以短信应用如果需要兼容android4.4.2及以下版本,则需要接收这两个广播,这样一来就可以保证都能收的到;但是总是开心的太早,换了一部android4.4.2的手机,发现开始接收到重复的短信,原来这些所谓厚道的厂家,两个广播都发;这下好了,改怎么处理呢?
这边有一个最土的方式,就是拦截,获取短信时间,判断时间是否与上一条短信时间相同,如果相同不做处理,基本上是同事触发。这个方法虽然最快,但是并不觉的靠谱,继续实现的话,还得继续分析android4.4.2的源码。
以下提供判断android4.4.2默认短信应用代码:
/** * 默认短信检测 * @param context 应用对象 * @param myPackageName 应用包名 * @return */ public static boolean isDefaultSms(Context context,String myPackageName){ boolean isDefault=false; try { int currentapiVersion=android.os.Build.VERSION.SDK_INT; if(currentapiVersion>=android.os.Build.VERSION_CODES.KITKAT){ String defaultSmsApplication = Telephony.Sms.getDefaultSmsPackage(context); if (defaultSmsApplication != null && defaultSmsApplication.equals(myPackageName)) { isDefault=true; } } } catch (Exception e) { // TODO: handle exception } return isDefault; } /** * 前往设置默认短信应用 * @param context 应用对象 * @param myPackageName 应用包名 */ public static void startSetDefault(Context context,String myPackageName){ String ACTION_CHANGE_DEFAULT = "android.provider.Telephony.ACTION_CHANGE_DEFAULT"; String EXTRA_PACKAGE_NAME = "package"; int currentapiVersion=android.os.Build.VERSION.SDK_INT; if(currentapiVersion>=android.os.Build.VERSION_CODES.KITKAT){ if(!isDefaultSms(context,myPackageName)){ Intent intent = new Intent(ACTION_CHANGE_DEFAULT); intent.putExtra(EXTRA_PACKAGE_NAME, context.getPackageName()); context.startActivity(intent); } } }