android4.4.2 短信广播变更

近期三星陆续放出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);
			}
		}
	}

  

android4.4.2 短信广播变更

时间: 2024-11-03 20:50:55

android4.4.2 短信广播变更的相关文章

Android手机获取通讯录联系人信息及短信广播实现

现在越来越多的android应用在注册时都要用到手机号码,通过获取手机验证码来完成注册.也有不少应用提供了手机通讯录备份功能,获得你的允许后把你的通讯录中的手机号码保存到服务器中,你要的时候又可以down下来,比如微信,QQ等就有这们的功能.那我们怎么样获取用户通讯录中的手机号码呢?Android已经为我们做好了准备: ---------------------------------获取通讯录联系人信息----------------------------------------------

Android 监听系统短信广播

使用场景: 1.对系统接收到的短信进行识别,是广告或者是诈骗等 2.对短信内容进行过滤或者是对内容进行提取,比如验证码提取 3.对系统短信进行拦截,连系统自己都不让收到了(不会出现在系统数据里面,也不会有系统短信的通知栏提示) 备注: 1.系统短信广播为有序广播,要拦截的话,需要在注册广播的时候设置广播优先级为最大,不过这种也有风险,如果被其他的应用先拦截了,那么我们将不再收到,使用时需注意. 2.要接到系统短信广播,那么应用必须具备短信读取权限,这对使用者来说可能是一个限制 3.除了短信读取权

Android4.4 往短信收件箱中插入自定义短信(伪造短信)

这段时间稍微有点空闲,把前一段学习Android做过的一些小项目整理整理.虽然没有什么工程量很大的项目,但是对于一个新手,解决这些问题还是花了一段时间.感觉还是非常有记录的意义呢~~~么么哒*—* 今天要说明的这个项目,是要在Android手机里伪造一条短信,也就是在短信箱中插入一条自定义的短信,看上去就像自己的手机里收到了新的信息,但其实这并不是一条通过通信运营商的网络发过来的信息,这是一条假的信息. 在Android4.4之前的版本,往短信箱插入信息很方便,所以这个对用户来说很有威胁的漏洞,

(十六)短信广播接收

一.需求:当接收到短信到来的广播的时候,获得短信的内容和发件人 二.SmsReceiver.java文件如下所示: package com.example.smslistenerreiceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.SmsMessage; import a

关于小米(红米1s) 接收不到短信广播的问题

什么也不说,有图有真相 网上没找到合适的方案. 1.点击短信,进去之后,点手机上的左边的按钮,就出来第一个图了 2.之后选中高级设置在弹出的页面,把系统短信优先去掉就ok了 .费了一下午时间就弄了个这个 我去!!! 希望通过分享能让更多的人学习到知识,少走弯路

25短信指令的广播接受者

这里创建一个短信广播接受者,并让他的优先级最大,设置他的动作为:接收短信(需要添加权限) <receiver android:name="com.ustc.mobilemanager.receiver.SMSReceiver" > <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIV

Android广播组件实践——短信黑名单

转载请注明出处:http://blog.csdn.net/chengbao315/article/details/51011358 相关阅读: Android服务组件案例:http://blog.csdn.net/chengbao315/article/details/50997218 上回书我提到了想要编写安卓四大组件案例的想法,那么说到做到,这次我就来做一个Android广播组件的案例.这次想要模仿手机360软件的短信黑名单功能,可以实现号码加入黑名单,后台运行程序,短信来到时进行拦截,并可

Android广播接收短信的简单实现

说明: 接受短信广播,由Intent解析出短信内容明文, intent中的短信时已pud形式传出的,即byte[][]二位数组, 需要转化出明文SmsMessage.createFromPdu(pdus[i]) 广播接收器: public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent != null

【Android】几种常见广播监听器(Wifi,亮灭屏,Home键,短信)总结

Wifi状态监听的广播接收者 /** * 监控Wifi状态的广播接收器,注意不需要添加任何权限 */ public final class WifiStateReceiver extends BroadcastReceiver { private static final String TAG = "TagForWifiStateReceiver"; @Override public void onReceive(Context c, Intent intent) { Bundle b