我正在使用Java中的以下代码拦截SMS
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle extras = intent.getExtras();
if (extras == null)
return;
Object[] pdus = (Object[]) extras.get("pdus");
for (int i = 0; i < pdus.length; i++) {
SmsMessage SMessage = SmsMessage.createFromPdu((byte[]) pdus[i]);
String sender = SMessage.getOriginatingAddress();
String body = SMessage.getMessageBody().toString();
Log.i("TAG", body);
//... do whatever with the message here
}
}
}
使用Manifest.xml中的以下接收器
</receiver>
<receiver android:name="com.example.test.SmsReceiver" >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
它与Nexus 5一起运行良好,但它不在三星,任何人都知道如何让它在三星工作
答案 0 :(得分:2)
Pre-KitKat短信广播可能会被拦截甚至中止,但环聊仍会处理该消息。看这篇文章:
Suppress / Block BroadcastReceiver in another app
而且:
Enabling SMS support in Hangouts 2.0 breaks the BroadcastReceiver of SMS_RECEIVED in my app
环聊注册了他们的AbortSmsRecevier优先级为“3”,因此将接收者优先级设置为“3”以上可以解决您的问题并拦截它。但是,如果您尝试将消息“首先”,那么“999”应该这样做。但是,请注意这并不理想,因为反垃圾邮件应用程序可能需要在应用程序执行之前处理邮件,具体取决于您的应用程序的功能。 (这个问题 - 应用程序“争夺最高优先级”是Android改变KitKat的原因,无论好坏......)
这是Google Talk / Babel清单的摘录:
<receiver android:name="com.google.android.apps.babel.sms.AbortSmsReceiver" android:permission="android.permission.BROADCAST_SMS" android:enabled="false">
<intent-filter android:priority="3">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
如果您试图中止邮件,那么您将遇到问题。处理邮件的环聊SMS接收器设置为Integer.MAX_VALUE
,但是中止邮件的接收器是我刚发布的那个。
这是另一个接收者:
<receiver android:name="com.google.android.apps.babel.sms.SmsReceiver" android:permission="android.permission.BROADCAST_SMS" android:enabled="false">
<intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
注意:超过“999”或低于“-999”的优先级是“系统级别” - 但是,文档指出请求优先于此的优先级的非系统应用程序将具有“不可预测”的行为。这绝对是我所看到的 - 应用程序无法预测或可靠地“击败”该级别以上的其他应用程序(取决于设备,安装顺序,重新启动等)。