使用装有MIUI系统的小米手机,静态注册的广播接收器监听短消息。
- 在
AndroidManifest.xml
中声明权限
<uses-permission android:name="android.permission.RECEIVE_SMS" />
- 在
AndroidManifest.xml
中声明广播接收器
<receiver
android:name=".SmsReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
- 广播接收器代码:
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 从intent中获取消息
SmsMessage[] smsMessages = getMessagesFromIntent(intent);
// 获取短信发送者号码
String senderNumber = smsMessages[0].getOriginatingAddress();
// 组装短信内容
StringBuilder content = new StringBuilder();
for (SmsMessage smsMessage : smsMessages) {
content.append(smsMessage.getMessageBody());
}
// 获取卡槽位置
Bundle bundle = intent.getExtras();
int slot = bundle.getInt("android.telephony.extra.SLOT_INDEX", -1);
}
}
要点:
- 先通过
getMessagesFromIntent(Intent)
获取SmsMessage
数组 - 再通过遍历
SmsMessage
数组,把每一条SmsMessage
的getMessageBody()
组装成短信内容 - 短信发送者号码可以通过首个
SmsMessage
对象的getOriginatingAddress()
方法获得 - 对于双卡手机,还可以在广播到达的
Intent
的Bundle
中, 通过Bundle.getInt("android.telephony.extra.SLOT_INDEX", -1)
, 来获取卡槽的位置。0为卡槽1,1为卡槽2。获取失败为-1。
注意:
- MIUI 等定制系统,申请权限可能不会弹窗,需要手动去设置中打开权限。
- MIUI 等定制系统,需打开应用的自启动功能,方可在短信到达时后台启动应用,运行广播接收器中相应逻辑。
- 广播接收器
onReceive
方法的超时限制有 10s,超过10s后系统会弹 ANR 弹窗。
原创文章,作者:,如若转载,请注明出处:https://blog.ytso.com/271976.html