Android 短信拦截的2种方式

第一种是通过BroadcastReciver

<uses-permission android:name="android.permission.RECEIVE_SMS"/> <!-- 拦截短信(就是接受短些的权限) -->

 
<receiver android:name="com.demo.artshell.broadcastreceiverdemo.InterceptReceiver"> 
<!--
这里没有设置android:enable和android:exported属性,<a href="http://developer.android.com/guide/topics/manifest/receiver-element.html" target="_blank" rel="nofollow">参考官方文档</a>
-->
      <!--这里的优先级为1000,假定你手机中没有安装其他第三方短信拦截软件,如360等,否则其他第三方软件拦截权限过高导致你都应用程序拦截不到短信-->
      <intent-filter android:priority="1000">
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
      </intent-filter>
</receiver
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;
 
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class InterceptReceiver extends BroadcastReceiver {
    public static final String TAG = "InterceptReceiver";
    public static final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
 
    public InterceptReceiver() {}
 
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG,"---------------InterceptReceiver onReceive()----------------");
 
        if (ACTION_SMS_RECEIVED.equals(intent.getAction())) {
            Bundle carryContent = intent.getExtras();
            if (carryContent != null) {
                StringBuilder sb = new StringBuilder();
 
                // 通过pdus获取接收到的所有短信息,获取短信内容
                Object[] pdus = (Object[]) carryContent.get("pdus");
                // 构建短信对象数组
                SmsMessage[] mges = new SmsMessage[pdus.length];
                for (int i = 0, len = pdus.length; i < len; i++) {
                    // 获取单条短信内容,以pdu格式存,并生成短信对象
                    mges[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                }
 
                for (SmsMessage mge : mges) {
                    sb.append("短信来自:" ).append(mge.getDisplayOriginatingAddress()).append("\n")
                      .append("短信内容:").append(mge.getMessageBody()).append("\n");
 
                    Date sendDate = new Date(mge.getTimestampMillis());
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    sb.append("短信发送时间:").append(format.format(sendDate));
                }
                Log.i(TAG,sb.toString()); // 打印日志记录
                Toast.makeText(context,sb.toString(),Toast.LENGTH_LONG).show();
                this.abortBroadcast(); // 不再往下传播
            }
        }
    }
}

第二种通过ContentObserver

content://sms/inbox 收件箱 
content://sms/sent 已发送 
content://sms/draft 草稿 
content://sms/outbox 发件箱 
content://sms/failed 发送失败 
content://sms/queued 待发送列表

private SmsObserver smsObserver;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.app_login);
		smsObserver = new SmsObserver(this, null);
		getContentResolver().registerContentObserver(SMS_INBOX, true,
				smsObserver);

	}

	protected void onstop()
	{
	  super.onstop();
	  //必须解除注册,否则Activity不能销毁
	   getContentResolver().unregisterContentObserver(smsObserver);
	}

	class SmsObserver extends ContentObserver {

		public SmsObserver(Context context, Handler handler) {
			super(handler);
		}

		@Override
		public void onChange(boolean selfChange) {
			super.onChange(selfChange);
			//每当有新短信到来时,使用我们获取短消息的方法
			getSmsFromPhone();
		}
	}

查询数据库

        private Uri SMS_INBOX = Uri.parse("content://sms/inbox");
	public void getSmsFromPhone() {
		ContentResolver cr = getContentResolver();
		String[] projection = new String[] { "body" };//"_id", "address", "person",, "date", "type
		String where = " address = ‘1066321332‘ AND date >  "
				+ (System.currentTimeMillis() - 10 * 60 * 1000);
		Cursor cur = cr.query(SMS_INBOX, projection, where, null, "date desc");
		if (null == cur)
			return;
		if (cur.moveToNext()) {
			String number = cur.getString(cur.getColumnIndex("address"));//手机号
			String name = cur.getString(cur.getColumnIndex("person"));//联系人姓名列表
			String body = cur.getString(cur.getColumnIndex("body"));
			//这里我是要获取自己短信服务号码中的验证码~~
			Pattern pattern = Pattern.compile(" [a-zA-Z0-9]{10}");
			Matcher matcher = pattern.matcher(body);
			if (matcher.find()) {
				String res = matcher.group().substring(1, 11);
				mobileText.setText(res);
			}
		}
	}

sms主要结构:

_id:短信序号,如100    
thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的    
address:发件人地址,即手机号,如+86138138000    
person:发件人,如果发件人在通讯录中则为具体姓名,陌生人为null    
date:日期,long型,如1346988516,可以对日期显示格式进行设置    
protocol:协议0SMS_RPOTO短信,1MMS_PROTO彩信    
read:是否阅读0未读,1已读    
status:短信状态-1接收,0complete,64pending,128failed    
type:短信类型1是接收到的,2是已发出    
body:短信具体内容    
service_center:短信服务中心号码编号,如+8613800755500

Android4.4方案有些问题,看这里

如何在Android 4.4上实现短信拦截

------------------------------------------------

推荐博客:

http://my.csdn.net/L173864930

http://su1216.iteye.com/

时间: 2024-12-29 10:48:57

Android 短信拦截的2种方式的相关文章

Android 短信拦截

不废话说重点: AndroidManifest.xml文件代码如下: <uses-permission android:name="android.permission.RECEIVE_SMS"/> <!-- 拦截短信(就是接受短些的权限) --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <!-- 开机启动完成后

Android中实现短信发送的一种方式

SendSmsActivity.java: package com.test.smsmangerdemo.sendsmsactivity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.Intent; import android.app.PendingIntent; import android.telephony.SmsManager; imp

android短信拦截

广播分2种,无序广播和有序广播.可以理解为散列和队列广播.首先无序广播,不能中断,分发机制有点类似散列发送.这种广播的的发送为:context.sendBroadcast这种广播是不能中断的,请看API说明.其次为有序广播,可以中断.这种广播,以我的理解可能存在很大的BUG,短信这块广播的发送BUG现在被QQ和360利用,可能在以后的版本中会修订.它是一个按一种优先级顺序发送,即按某种messagequere队列发送,其中队列中的任何广播接收者都可以终端该广播,导致它之后的成员不能接收到广播.我

Android短信拦截和电话拦截

MainActivity: package com.wyl.bctest; import android.support.v7.app.ActionBarActivity; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; i

转: 如何在Android 4.4上实现短信拦截

众所周知Android在4.4上增加了不少安全措施,除了把SELinux设置为enforce外,在短信方向也加强了限制. 4.4之后,新增了一个default sms的机制,详细的描述,可以参考我的另一篇文章<谈谈4.4中的新增功能对安全类软件的影响>.简而言之,就是如果要在4.4之后实现短信拦截功能,就必须成为default sms,把所有短信相关的功能都包揽了,然后再做短信拦截.但这种做法,适配性和兼容性的工作是非常巨大的,短信.wapush(多种).彩信.单双卡等等,相当于要求短信拦截类

Android——BroadcastReceiver 广播 短信拦截

/** * 如何去理解BroadcastReceiver(广播)?   * 其实可以这样想,首先我们要有一个发送广播的“媒体”,在这个例子中,我们暂且用activity组件作为这个媒体,当然以后 * 会用到service,或者随机启动方式来发送广播,这看业务需求来决定. * 在这个例子中,当点击按钮的时候,一条广播就发送了出去,同样用到了意图对象Intent. * 和启动activity和service一样,我们需要为意图对象设置“标记”和“包裹”,它就像个基站,向世界发送信号. * 而对于广播

[android] 手机卫士黑名单功能(短信拦截)

前面我们把需要拦截的手机号都存储和展示出来了,接下来是使用广播接收者拦截短信了,这个广播接收者需要和一个服务绑定,服务开启的时候,接收者存在,服务停掉时,接收者关闭 在service包下定义一个类CallSmsSafeService继承系统的Service 重写onCreate()方法 获取BroadcastReceiver对象,new出来 调用registerReceiver()方法,注册广播,参数:BroadcastReceiver对象,IntentFillter对象 重写onDestory

Android应用源码安卓短信拦截木马项目源码

温馨提示:本资源由源码天堂整理提供下载转载时请留下链接说明:http://code.662p.com/view/9174.html安卓短信拦截木马源码主要功能就是开机后台启动,拦截本机收到的短信并且转发到指定号码,同时使原短信在手机上不显示,如果不慎安装了这玩意,什么支付宝安全什么财付通安全,只要是有手机短信验证的安全都不叫安全了.木马apk重新签名后手机360免杀,可能手机上的安全360还停留在核对apk的md5或者hash的阶段.也就是所谓的云查杀.但是360会默认提示短信权限.另外我百度了

短信拦截马黑产揭露 - 莫伸手,伸手必被抓

概述 从2013年5月至今,AVL移动安全团队持续监测到了一类高活跃高危害的短信拦截类型木马.短信拦截马,顾名思义是一种可以拦截他人短信木马,就是让被攻击者收不到短信,并将短信内容截取到攻击者手机上. 此类木马目前最常见的是通过钓鱼.诱骗.欺诈等方式诱导用户装上木马,然后通过拦截转发用户短信内容,以此获取各种用户重要的个人隐私信息,如用户姓名.身份证号码.银行卡账户.支付密码及各种登录账号和密码等,造成这些信息的泄露,再利用此信息从而达到窃取用户资金的目的,严重威胁用户的财产安全. 另外,此前流