zoukankan      html  css  js  c++  java
  • Android API 拦截系统短消息

    短消息是一个系统广播,所以我们需要在配置文件中填写相关的广播接收信息才能接收到系统短消息的广播通知,配置文件如下:

    <?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
        package="com.qlf.test" android:versionCode="1" android:versionName="1.0"> 
        <application android:icon="@drawable/icon" android:label="@string/app_name"> 
            <activity android:name=".mainActivity" android:label="@string/app_name"> 
                <intent-filter> 
                    <action android:name="android.intent.action.MAIN" /> 
                    <category android:name="android.intent.category.LAUNCHER" /> 
                </intent-filter> 
            </activity> 
            
            <!--接受短消息需要注册的receiver,其中的android:name是继承了BroadCastReceiver的类的位置 
            android:priority="100" 指定了接收器的级别,这里设置的值比系统的值要高,这意味着程序的接受 
            短消息要早于系统接受短消息,这也就给我们提供了拦截短消息,不让系统发出短消息提示的机会。 
            --> 
            <receiver android:name=".SmsBroadCast"> 
                <intent-filter android:priority="100"> 
                    <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
                </intent-filter> 
            </receiver>
    
    
        </application> 
        <uses-sdk android:minSdkVersion="8" /> 
        <uses-permission android:name="android.permission.RECEIVE_SMS" /> 
    </manifest>
    

    然后,编写继承了BroadCastReceiver的类,用来实现短信广播的接受:

    public class SmsBroadCast extends BroadcastReceiver 
    {
    
        @Override 
        public void onReceive(Context arg0, Intent arg1) 
        { 
            String dString = SmsHelper.getSmsBody(arg1); 
            String address  = SmsHelper.getSmsAddress(arg1); 
            Log.i("qlf", dString+","+address); 
            
            //阻止广播继续传递,如果该receiver比系统的级别高, 
            //那么系统就不会收到短信通知了 
            abortBroadcast(); 
        } 
    }
    

    随后再看看上面的SmsHelper类是如何实现短信的接收工作的。你也不要问我为什么是这么接收的,因为API就是这么用的,照办就是了:

    /**
     * 短信帮助类
     * 
     * @author qianlifeng 2011-3-14
     * */
    public class SmsHelper
    {
    	/**
    	 * 获得短信内容
    	 * */
    	public static String GetSmsBody(Intent intent)
    	{
    		String tempString = "";
    		Bundle bundle = intent.getExtras();
    		Object messages[] = (Object[]) bundle.get("pdus");
    		SmsMessage[] smsMessage = new SmsMessage[messages.length];
    		for (int n = 0; n < messages.length; n++)
    		{
    			smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
    			// 短信有可能因为使用了回车而导致分为多条,所以要加起来接受
    			tempString += smsMessage[n].getDisplayMessageBody();
    		}
    		return tempString;
    	}
    
    	/**
    	 * 获得短信地址
    	 * */
    	public static String GetSmsAddress(Intent intent)
    	{
    		Bundle bundle = intent.getExtras();
    		Object messages[] = (Object[]) bundle.get("pdus");
    		return SmsMessage.createFromPdu((byte[]) messages[0])
    				.getDisplayOriginatingAddress();
    	}
    
    	/**
    	 * 发送短信
    	 **/
    	public static Boolean SendSms(Context context,String addre, String mess)
    	{
    			try
    			{
    				PendingIntent mPI = PendingIntent.getBroadcast(context, 0, new Intent(), 0);
    				SmsManager.getDefault().sendTextMessage(addre, null, mess, mPI,null);
    				return true;
    			}
    			catch (Exception e)
    			{
    				return false;
    			}
    	}
    }
    

    一些朋友可能还不知道如何在模拟器里面发送短消息,我截个图大家看一下:

    2011-03-14_205639

    最后,我们看一下拦截短信效果的截图:

    2011-03-14_205756

    源码下载

             下载

  • 相关阅读:
    2019牛客暑期多校训练营(第二场)
    2019牛客暑期多校训练营(第一场)
    JOISC2014 挂饰("01"背包)
    UPC 2019年第二阶段我要变强个人训练赛第十六场
    UPC个人训练赛第十五场(AtCoder Grand Contest 031)
    Wannafly挑战赛15 C“出队”(约瑟夫环类问题)
    UVA 133“The Dole Queue”(循环报数处理技巧)
    洛谷P1169 [ZJOI2007]棋盘制作 悬线法 动态规划
    洛谷P1273 有线电视网 树上分组背包DP
    CF1097D Makoto and a Blackboard 质因数分解 DP
  • 原文地址:https://www.cnblogs.com/qianlifeng/p/1984214.html
Copyright © 2011-2022 走看看