我写了下面的方法来读取传入的短信文本。当默认的SMS客户端是本机SMS客户端时,此代码在Android 4.04中完美运行,但是当SMS客户端是环聊时,该方法不起作用。
相同的方法在Android 5中使用环聊作为短信客户端,问题仅在Android 4.04中,环聊为短信客户端。如果我遗漏了任何东西,请告诉我。
static boolean readSMS(Intent intent, int code) {
try {
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdusObj = (Object[]) bundle.get("pdus");
for (int i = 0; i < pdusObj.length; i++) {
SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
String message = currentMessage.getDisplayMessageBody();
if (message.contains(String.valueOf(code)))
return true;
}
}
} catch (Exception e) {
return false;
}
return false;
}
从BroadCastReceiver中的java代码调用该方法。
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
if (readSMS(intent, code)) {
------------------
}
}
BroadCastReceiver
被调用为:
context.registerReceiver(receiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));
的Manifest.xml
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
答案 0 :(得分:2)
传入的短信是Broadcast transmission
,您可以注册receiver
来收听短信并根据您的逻辑进行回复。您可以向SMS广播注册多个接收者,他们将按一定的顺序逐个获取SMS
我们怎么知道订单?每个接收器都有一个priority
,操作系统将SMS从较高优先级的接收器发送到较低的接收器
高达Android 4.4
(不包括),您可以使用abortBroadcast();
语句,这将终止分派。让我们说我们有两个应用程序--A和B与SMS接收器。如果A的优先级高于B而A使用中止语句,则应用B将永远不会获得短信。从Android 4.4
开始,您就不能再中止短信传输了
从您的问题看,当您使用Android 4.0.4
时,环聊客户端具有较高的应用优先级,并且它会中止广播传输,而默认客户端不会中止它(或具有较低的优先级)。当您切换到Android 5时,环聊无法中止短信,因此您的应用可以正常工作
至于优先级 - documentation表示&#34; 该值必须是整数,例如&#34; 100&#34;。数字越大,优先级越高。默认值为0.该值必须大于-1000且小于1000。&#34;。
你可以添加你的menifanifest线
<intent-filter android:priority="999">
并希望环聊的优先级更低。