首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

短信拦截如何比360 youni短信等有更高的优先级

2013-03-13 
短信拦截怎么比360youni短信等有更高的优先级最近在做一个短信拦截的应用,在网上找了很多的代码 大部分都

短信拦截怎么比360 youni短信等有更高的优先级
  最近在做一个短信拦截的应用,在网上找了很多的代码 大部分都是设置一个监听器来监听,监听到之后就终止这个广播,具体代码如下:
 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短信之类的软件的话我们写的程序是接收不到广播的,不管我们把自己的广播监听的优先级设置为多少都监听不到。想问问各位大虾有没有方法解决这个办法。如果是监听数据库变化的方法就算了,那个可以实现,不过还是想从广播上下手。   
[解决办法]
priority="800"
1000是上限把
如果相同的话应该是随机排序的。
[解决办法]
用动态注册的模式有更高优先级
设置最大值:android:priority="2147483647"
可以开机启动一个服务进行动态注册

[解决办法]

引用:
用动态注册的模式有更高优先级
设置最大值:android:priority="2147483647"
可以开机启动一个服务进行动态注册

这是真的吗?学习了。。。如果360等程序也采用这种方法,那么谁会先接收到广播呢?
开机启动这个服务应该是静态得了吧。但是如果360也采用一个priority="1000"的静态Receiver来接收开机广播,然后动态注册他的短信Receiver,级别也设成最大,那么我们和360谁会先接收到呢?
是无序的么?
[解决办法]
优先值最大也就unsigned int的最大值,360也是这样的,至于那个先监听到,我试了下,貌似是哪个先安装哪个先监听到。
[解决办法]
监听软件有免费的吗
[解决办法]
引用:
引用:用动态注册的模式有更高优先级
设置最大值: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版本的机器。如果用模拟器调试的话是可以执行的。
[解决办法]
引用:
引用:引用:用动态注册的模式有更高优先级
设置最大值:android:priority="2147483647"
可以开机启动一个服务进行动态注册
这是真的吗?学习了。。。如果360等程序也采用这种方法,那么谁会先接收到广播呢?
开机启动这个服务应该是静态得了吧。但是如果360也采用一个prior……


360优先级别之所以高是因为他是动态注册的广播,然后开机启动。动态广播比静态优先级别高,动态注册的广播优先级别是谁先注册谁就先接收到。所以这就要归根到谁先启动程序,开机谁先启动,那谁就先注册广播,谁也就能先接收到短信的广播了。至于如何开机先启动,看我上面的回答,数组排名靠前的就先启动。这个仅限第三方安装的。内置的顺序当然要高于第三方
[解决办法]
这个我之前也被困扰很久,有两个个办法可以做到。
1.开机启动服务,在这个服务里面动态注册广播接收器。
2.去监听短信数据库,而不是去监听广播。只要注册的载体没被销毁就可以接受到数据。
[解决办法]
引用:
用动态注册的模式有更高优先级
设置最大值:android:priority="2147483647"
可以开机启动一个服务进行动态注册


真的?这么牛,,,我又学习了。。。
[解决办法]
引用:
这个我之前也被困扰很久,有两个个办法可以做到。
1.开机启动服务,在这个服务里面动态注册广播接收器。
2.去监听短信数据库,而不是去监听广播。只要注册的载体没被销毁就可以接受到数据。

第二句没懂,请说下。。。
[解决办法]
引用:
引用:
这个我之前也被困扰很久,有两个个办法可以做到。
1.开机启动服务,在这个服务里面动态注册广播接收器。
2.去监听短信数据库,而不是去监听广播。只要注册的载体没被销毁就可以接受到数据。
第二句没懂,请说下。。。


你可查一下ContentObserver的用法。这个是一个用于监听数据库变动的类。短信收发都会触发短信的数据库。
[解决办法]
动态注册的模式的priority取值范围我不清楚

可以参考如下链接: http://blog.csdn.net/ycjunhua/article/details/6591560  

热点排行