安卓截取短信

在安卓设备上,为了截取短信,需要获取相应的读取短信权限。在一些如小米的手机上,由于系统默认优先处理短信,可能导致自定义的应用无法正常接收短信。解决办法是在短信设置的高级选项中关闭系统短信优先权,这样第三方应用就能正确地拦截和处理短信了。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需要读取短信权限:

 
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
注册广播:

开机广播与收到短信广播

        <receiver android:name="com.ecache.receivemessage.SMSReceiver" >
            <intent-filter android:priority="999" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

之后要继承BroadcastReceiver类并重写onReceive方法:

	public void onReceive(Context context, Intent intent) {
	
		if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
			//开机
		} else {
				//收到短信
			Object[] pdus = (Object[]) intent.getExtras().get("pdus");
			if (pdus != null) {
				for (Object pdu : pdus) {
					SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdu);

					String adr = sms.getOriginatingAddress();//发件人手机号
					if (adr.length() > 11) {
						int start = adr.length() - 11;
						adr = adr.substring(start, adr.length());
					}
					String body = sms.getMessageBody();//短信内容
					//自己处理逻辑
				}
			}
		}
	}

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


相信很多人写的短信监听应用在小米等手机上是拦截不到短信的,这是因为小米对短信的处置权优先分给了系统。我们可以在短信的【设置】→【高级设置】→【系统短信优先】中发现短信的优先处理权默认是分给系统的,只要关闭这个系统优先权,短信监听应用就可以正常的拦截到短信了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值