短信拦截怎么比360 youni短信等有更高的优先级

李牙刷儿_ 2012-12-07 04:16:56
最近在做一个短信拦截的应用,在网上找了很多的代码 大部分都是设置一个监听器来监听,监听到之后就终止这个广播,具体代码如下:
Manifest.xml
<receiver android:name=".SmsReceiver">
<intent-filter android:priority="800">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>


SmsReceiver.java


public class SmsReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
// 判断是系统短信;
if (intent.getAction()
.equals("android.provider.Telephony.SMS_RECEIVED")) {
// 不再往下传播;
this.abortBroadcast();
StringBuffer sb = new StringBuffer();
String sender = null;
String content = null;
String sendtime = null;
Bundle bundle = intent.getExtras();
if (bundle != null) {
// 通过pdus获得接收到的所有短信消息,获取短信内容;
Object[] pdus = (Object[]) bundle.get("pdus");
// 构建短信对象数组;
SmsMessage[] mges = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
// 获取单条短信内容,以pdu格式存,并生成短信对象;
mges[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
for (SmsMessage mge : mges) {
sb.append("短信来自:" + mge.getDisplayOriginatingAddress()
+ "\n");
sb.append("短信内容:" + mge.getMessageBody());

sender = mge.getDisplayOriginatingAddress();// 获取短信的发送者
content = mge.getMessageBody();// 获取短信的内容
Date date = new Date(mge.getTimestampMillis());
SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
sendtime = format.format(date);// 获取短信发送时间;
// SmsManager manager = SmsManager.getDefault();
// manager.sendTextMessage("5556",
// null,"发送人:"+sender+"-----发送时间:"+sendtime+"----内容:"+content,
// null, null);//把拦截到的短信发送到指定的手机,此处为5556;
// if ("5556".equals(sender)){
// //屏蔽手机号为5556的短信,这里还可以时行一些处理,如把该信息发送到第三人的手机等等。
// abortBroadcast();
// }
}
Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG)
.show(); }


}

}



但是这样有一个致命的问题,就是如果手机上诸如360 youni短信之类的软件的话我们写的程序是接收不到广播的,不管我们把自己的广播监听的优先级设置为多少都监听不到。想问问各位大虾有没有方法解决这个办法。如果是监听数据库变化的方法就算了,那个可以实现,不过还是想从广播上下手。
...全文
635 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdn_2013 2013-02-04
  • 打赏
  • 举报
回复
动态注册的模式的priority取值范围我不清楚 可以参考如下链接: http://blog.csdn.net/ycjunhua/article/details/6591560
A562806113 2013-02-04
  • 打赏
  • 举报
回复
引用 14 楼 KPRF2009 的回复:
引用 11 楼 A562806113 的回复: 这个我之前也被困扰很久,有两个个办法可以做到。 1.开机启动服务,在这个服务里面动态注册广播接收器。 2.去监听短信数据库,而不是去监听广播。只要注册的载体没被销毁就可以接受到数据。 第二句没懂,请说下。。。
你可查一下ContentObserver的用法。这个是一个用于监听数据库变动的类。短信收发都会触发短信的数据库。
KPRF2009 2013-02-03
  • 打赏
  • 举报
回复
引用 11 楼 A562806113 的回复:
这个我之前也被困扰很久,有两个个办法可以做到。 1.开机启动服务,在这个服务里面动态注册广播接收器。 2.去监听短信数据库,而不是去监听广播。只要注册的载体没被销毁就可以接受到数据。
第二句没懂,请说下。。。
KPRF2009 2013-02-03
  • 打赏
  • 举报
回复
引用 2 楼 yinke22222 的回复:
用动态注册的模式有更高优先级 设置最大值:android:priority="2147483647" 可以开机启动一个服务进行动态注册
真的?这么牛,,,我又学习了。。。
A562806113 2013-01-07
  • 打赏
  • 举报
回复
这个我之前也被困扰很久,有两个个办法可以做到。 1.开机启动服务,在这个服务里面动态注册广播接收器。 2.去监听短信数据库,而不是去监听广播。只要注册的载体没被销毁就可以接受到数据。
兰卡威 2013-01-06
  • 打赏
  • 举报
回复
引用 8 楼 yangyeefeng 的回复:
引用 3 楼 wlcw16 的回复:引用 2 楼 yinke22222 的回复:用动态注册的模式有更高优先级 设置最大值:android:priority="2147483647" 可以开机启动一个服务进行动态注册 这是真的吗?学习了。。。如果360等程序也采用这种方法,那么谁会先接收到广播呢? 开机启动这个服务应该是静态得了吧。但是如果360也采用一个prior……
360优先级别之所以高是因为他是动态注册的广播,然后开机启动。动态广播比静态优先级别高,动态注册的广播优先级别是谁先注册谁就先接收到。所以这就要归根到谁先启动程序,开机谁先启动,那谁就先注册广播,谁也就能先接收到短信的广播了。至于如何开机先启动,看我上面的回答,数组排名靠前的就先启动。这个仅限第三方安装的。内置的顺序当然要高于第三方
兰卡威 2013-01-06
  • 打赏
  • 举报
回复
引用 3 楼 wlcw16 的回复:
引用 2 楼 yinke22222 的回复:用动态注册的模式有更高优先级 设置最大值:android:priority="2147483647" 可以开机启动一个服务进行动态注册 这是真的吗?学习了。。。如果360等程序也采用这种方法,那么谁会先接收到广播呢? 开机启动这个服务应该是静态得了吧。但是如果360也采用一个priority="1000"的静态Recei……
4楼正解,可以通过 File file = new File("/data/app/"); String[] files = file.list(); 来打印此数组的顺序,这个顺序就是你安装的顺序。也就是广播接受先后的顺序。 如果你想改变先后顺序,需要修改你应用程序的包名。因为第三方应用安装后会在data/app下生成com.yourname-1.apk的文件夹,接受广播的顺序跟这个名字是有关的。 顺便提一下,执行上面那2行代码如果用真机调试的话需要root权限。或者系统为eng版本的机器。如果用模拟器调试的话是可以执行的。
azr8888 2012-12-24
  • 打赏
  • 举报
回复
监听软件有免费的吗
datm 2012-12-24
  • 打赏
  • 举报
回复
你不会把360那个垃圾卸了吗?
liuwons 2012-12-07
  • 打赏
  • 举报
回复
优先值最大也就unsigned int的最大值,360也是这样的,至于那个先监听到,我试了下,貌似是哪个先安装哪个先监听到。
wlcw16 2012-12-07
  • 打赏
  • 举报
回复
引用 2 楼 yinke22222 的回复:
用动态注册的模式有更高优先级 设置最大值:android:priority="2147483647" 可以开机启动一个服务进行动态注册
这是真的吗?学习了。。。如果360等程序也采用这种方法,那么谁会先接收到广播呢? 开机启动这个服务应该是静态得了吧。但是如果360也采用一个priority="1000"的静态Receiver来接收开机广播,然后动态注册他的短信Receiver,级别也设成最大,那么我们和360谁会先接收到呢? 是无序的么?
不简单de 2012-12-07
  • 打赏
  • 举报
回复
用动态注册的模式有更高优先级 设置最大值:android:priority="2147483647" 可以开机启动一个服务进行动态注册
wlcw16 2012-12-07
  • 打赏
  • 举报
回复
priority="800" 1000是上限把 如果相同的话应该是随机排序的。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧