阅读短信不起作用
Reading SMS not working
我写了下面的方法来读取传入的短信文本。此代码在 Android 4.04 中完美运行,当默认 SMS 客户端是本机 SMS 客户端时,但当 SMS 客户端是 Hangout 时,该方法不起作用。
同样的方法在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" />
传入的短信是一个 Broadcast transmission
,您可以注册一个 receiver
来收听它并根据您的逻辑进行回复。可以注册多个接收者到短信广播,他们都会按照一定的顺序,一个接一个的收到短信。
我们怎么知道顺序呢?每个接收者都有一个 priority
,OS 将 SMS 从优先级较高的接收者发送到较低的接收者。
在 Android 4.4
(不包括)之前,您可以使用 abortBroadcast();
语句来终止调度。假设我们有两个应用程序——A 和 B,带有 SMS 接收器。如果 A 的优先级高于 B,并且 A 使用了 abort 语句,那么应用 B 将永远不会收到短信。从 Android 4.4
开始,您将无法再中止 SMS 传输。
从你的问题来看,当你使用 Android 4.0.4
时,环聊客户端在你的应用程序中具有更高的优先级,并且它会中止广播传输,而默认客户端不会中止它(或具有较低的优先级)。当您切换到 Android 5 时,环聊无法中止短信,因此您的应用可以正常运行。
至于优先级 - documentation 声明“该值必须是整数,例如“100”。数字越大,优先级越高。默认值为 0。该值必须更大小于 -1000 且小于 1000.".
您可以将
这一行添加到您的 menifanifest
<intent-filter android:priority="999">
并希望环聊的优先级较低。
我写了下面的方法来读取传入的短信文本。此代码在 Android 4.04 中完美运行,当默认 SMS 客户端是本机 SMS 客户端时,但当 SMS 客户端是 Hangout 时,该方法不起作用。
同样的方法在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" />
传入的短信是一个 Broadcast transmission
,您可以注册一个 receiver
来收听它并根据您的逻辑进行回复。可以注册多个接收者到短信广播,他们都会按照一定的顺序,一个接一个的收到短信。
我们怎么知道顺序呢?每个接收者都有一个 priority
,OS 将 SMS 从优先级较高的接收者发送到较低的接收者。
在 Android 4.4
(不包括)之前,您可以使用 abortBroadcast();
语句来终止调度。假设我们有两个应用程序——A 和 B,带有 SMS 接收器。如果 A 的优先级高于 B,并且 A 使用了 abort 语句,那么应用 B 将永远不会收到短信。从 Android 4.4
开始,您将无法再中止 SMS 传输。
从你的问题来看,当你使用 Android 4.0.4
时,环聊客户端在你的应用程序中具有更高的优先级,并且它会中止广播传输,而默认客户端不会中止它(或具有较低的优先级)。当您切换到 Android 5 时,环聊无法中止短信,因此您的应用可以正常运行。
至于优先级 - documentation 声明“该值必须是整数,例如“100”。数字越大,优先级越高。默认值为 0。该值必须更大小于 -1000 且小于 1000.".
您可以将
<intent-filter android:priority="999">
并希望环聊的优先级较低。