zoukankan      html  css  js  c++  java
  • Android 短信拦截(一)

    本文转自http://www.cnblogs.com/GarfieldTom/archive/2012/08/25/2655609.html   基于4.03系统HTC测试可以正常拦截短信

    要做一个自动短信回复,所以需要拦截系统短信.

    1.在Manifest.xml里加"接收"SMS的权限

    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

    2.在Manifest.xml里注册一个receive

    <!-- 注册Receiver,并且设置优先级 -->
    <receiver android:name=".AutoSMS" android:exported="false">
       <intent-filter android:priority="1000">
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
       </intent-filter>
      </receiver>

    3.定义一个短信接收类,并且重写onReceive

    //继承BroadcastReceiver
    public class AutoSMS extends BroadcastReceiver 
    {
    
     private String TAG="AutSMS";
     //广播消息类型
     public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
     //覆盖onReceive方法
     @Override
     public void onReceive(Context context, Intent intent) 
     {

    下面是完整的代码:

    Manifest.xml:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.xxh.autosms"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="15" />
       <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/title_activity_main" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <!-- 注册Receiver,并且设置优先级 -->
            <receiver android:name=".AutoSMS" android:exported="false">
                <intent-filter android:priority="1000">
                    <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
                </intent-filter>
            </receiver>
            
        </application>
    
    </manifest>

    AutoSMS.java:

    package com.xxh.autosms;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.telephony.SmsMessage;
    import android.util.Log;
    import android.widget.Toast;
    
    //继承BroadcastReceiver
    public class AutoSMS extends BroadcastReceiver 
    {
    
        private String TAG="AutSMS";
        //广播消息类型
        public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
        //覆盖onReceive方法
        @Override
        public void onReceive(Context context, Intent intent) 
        {
            // TODO Auto-generated method stub
            Log.i(TAG, "引发接收事件");
            //StringBuilder body=new StringBuilder("");//短信内容
            //StringBuilder sender=new StringBuilder("");//发件人
            //先判断广播消息
            String action = intent.getAction();
            if (SMS_RECEIVED_ACTION.equals(action))
            {
                //获取intent参数
                Bundle bundle=intent.getExtras();
                //判断bundle内容
                if (bundle!=null)
                {
                    //取pdus内容,转换为Object[]
                    Object[] pdus=(Object[])bundle.get("pdus");
                    //解析短信
                    SmsMessage[] messages = new SmsMessage[pdus.length];
                    for(int i=0;i<messages.length;i++)
                    {
                        byte[] pdu=(byte[])pdus[i];
                        messages[i]=SmsMessage.createFromPdu(pdu);
                    }    
                    //解析完内容后分析具体参数
                    for(SmsMessage msg:messages)
                    {
                        //获取短信内容
                        String content=msg.getMessageBody();
                        String sender=msg.getOriginatingAddress();
                        Date date = new Date(msg.getTimestampMillis());
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        String sendTime = sdf.format(date);
                        //TODO:根据条件判断,然后进一般处理
                        if ("10060".equals(sender)) 
                        {
                            // 屏蔽手机号为10060的短信,这里还可以时行一些处理,如把这个信息发送到第三人的手机等等。
                            //TODO:测试
                            Toast.makeText(context, "收到10060的短信"+"内容:"+content, Toast.LENGTH_LONG).show();
                            //对于特定的内容,取消广播
                            abortBroadcast();
                        }
                        else
                        {
                            Toast.makeText(context, "收到:"+sender+"内容:"+content+"时间:"+sendTime.toString(), Toast.LENGTH_LONG).show();
                        }
                    }
                    
                }
            }//if 判断广播消息结束
        }
    
    }

     

     

  • 相关阅读:
    MSDN Magazine搞错了
    Visual Studio 2005中设置调试符号(Debug Symbols)
    BCB 6的问题
    吴裕雄天生自然Spring Boot使用Spring Data JPA实现人与身份证的一对一关系映射
    吴裕雄天生自然Spring BootSpring Data JPA
    吴裕雄天生自然Spring BootSpring Boot对JSP的支持
    吴裕雄天生自然Spring BootSpring Boot的异常统一处理
    吴裕雄天生自然Spring Boot使用Spring Data JPA实现Author与Article的一对多关系映射
    吴裕雄天生自然Spring Boot解决 Error creating bean with name 'entityManagerFactory' defined in class path resource
    吴裕雄天生自然Spring Boot@ExceptionHandler注解和@ControllerAdvice注解
  • 原文地址:https://www.cnblogs.com/sishuiliuyun/p/2771261.html
Copyright © 2011-2022 走看看