欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android短信拦截的实现代码

程序员文章站 2024-01-20 20:45:04
短信拦截的实现主要是使用了广播接收者来实现。 broadcastreceiver  广播接收者   必须指定要接收的广播类型。必须明确的指定a...

短信拦截的实现主要是使用了广播接收者来实现。

broadcastreceiver  广播接收者   必须指定要接收的广播类型。必须明确的指定action

 
广播:事件。
普通广播: 是异步的。会广播接收者同时接收,不能被中断
sendbroadcast()
有序广播: 是同步的。会根据广播接收的优先级进行接收,是可以中断   短信到来广播
sendorderbroadcast()
priority的范围是:-1000 ~ 1000
如果有序广播明确的指定了广播接收者,他是无法被中断的。

代码实现如下:

1、mainactivity

复制代码 代码如下:

package com.njupt.t4; 

import android.os.bundle; 
import android.app.activity; 
import android.content.intentfilter; 
import android.view.menu; 

public class mainactivity extends activity { 

    private smsreceiver receiver = new smsreceiver(); 
    @override 
    protected void oncreate(bundle savedinstancestate) { 
        super.oncreate(savedinstancestate); 
        setcontentview(r.layout.activity_main); 

        intentfilter filter = new intentfilter(); 
        filter.setpriority(997); 
        filter.addaction("android.provider.telephony.sms_received"); 
        registerreceiver(receiver,filter); 
    } 

    @override 
    public boolean oncreateoptionsmenu(menu menu) { 
        // inflate the menu; this adds items to the action bar if it is present. 
        getmenuinflater().inflate(r.menu.main, menu); 
        return true; 
    } 

    @override 
    protected void ondestroy() { 
        super.ondestroy(); 

        unregisterreceiver(receiver); 
    } 



2、smsreceiver
复制代码 代码如下:

package com.njupt.t4; 

import java.text.simpledateformat; 
import android.content.broadcastreceiver; 
import android.content.context; 
import android.content.intent; 
import android.os.bundle; 
import android.telephony.smsmanager; 
import android.telephony.smsmessage; 

public class smsreceiver extends broadcastreceiver { 

    @override 
    public void onreceive(context context, intent intent) { 

        system.out.println("章泽天是我老婆,老婆我成功了...."); 
        bundle bundle = intent.getextras(); 
        object[] objects = (object[]) bundle.get("pdus"); 
        for(object obj : objects){ 
            smsmessage smsmessage = smsmessage.createfrompdu((byte[])obj); 
            string body = smsmessage.getdisplaymessagebody(); 
            string address = smsmessage.getdisplayoriginatingaddress(); 
            long date = smsmessage.gettimestampmillis(); 

            simpledateformat format = new simpledateformat("yyyy-mm-dd hh:mm:ss"); 
            string datestr = format.format(date); 

            system.out.println(address +" 于  " + datestr + "给你发了以下内容: " + body); 

            if(address.equals("5558")){ 
                abortbroadcast(); 
                smsmanager smsmanager = smsmanager.getdefault(); 
                smsmanager.sendtextmessage("5556",null,address +" 于  " + datestr + "给你发了以下内容: " + body,null,null); 

            } 
        } 
    } 




 

3、androidmanifest.xml

需要在清单文件中注册上一下权限。(如果不注册是不会成功地拦截到短信的,在logcat中会以warn的

级别告诉你你没有相应的权限...)
复制代码 代码如下:

<uses-permission android:name="android.permission.receive_sms"/> 
   <uses-permission android:name="android.permission.send_sms"/> 
   <uses-permission android:name="android.permission.process_outgoing_calls"/> 


-----------------------------------------------------其实上面就是使用了代码的方式来注册broadcastreceiver-------------

其实还可以在androidmanifest.xml注册receiver这个组件(但是我采用这个方式总是会出现内存泄露的错误,所以下面的代码仅供参考)
复制代码 代码如下:

<receiver android:name=".smsreceiver"> 
            <intent-filter android:priority="1000"> 
                <action android:name="android.provider.telephony.sms_received"/> 
            </intent-filter> 
        </receiver>