菜鸟一枚,按照书上copy来的代码做短信拦截,用虚拟机测试成功,但用真机测试却总是不成功。按照程序逻辑,收到短信后应该弹出一个Toast提示,可我这里真机收到短信后没有出现Toast提示,真机还是像正常那样照常收到短信。
下面是代码:
1、先在AndroidMainActivity.xml中添加权限
<uses-permission android:name="android.permission.RECEIVE_SMS" />
也添加了receiver
<receiver
android:name=".ShortMessageReceiver"
android:enabled="true" >
<intent-filter android:priority="800" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" >
</action>
</intent-filter>
</receiver>
优先级按照网友说的设置到了800,书上没说让添加优先级。添加和不添加优先级的两种情况都测试了,都是在虚拟机上可行,在真机上就不行。很纳闷。
2、创建了一个新的类ShortMessageReceiver
package alex.example.receiver;
import java.util.Set;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
public class ShortMessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Bundle bundle = intent.getExtras();
if (bundle != null) {
Set<String> keys = bundle.keySet();
// 查看收到的广播包含哪些数据
for (String key : keys) {
Log.d("key", key);
}
// 获得收到的短信数据
Object[] objArray = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[objArray.length];
// 循环处理收到的所有短信
for (int i = 0; i < objArray.length; i++) {
// 将每条短信数据转换成SmsMessage对象
messages[i] = SmsMessage.createFromPdu((byte[]) objArray[i]);
// 获得发送短信的电话号码和短信内容
String s = "手机号:" + messages[i].getOriginatingAddress() + "\n";
s += "短信内容:" + messages[i].getDisplayMessageBody();
// 显示发送短信的电话号码和短信内容
Toast.makeText(context, s, Toast.LENGTH_LONG).show();
}
}
}
}
下面是虚拟机上的测试图
那为什么在真机上测试就不行呢,就不出Toast提示。
真机信息
型号 | 系统 | 安卓版本 | 内核版本 |
---|---|---|---|
Coolpad 7295C | MIUI-4.12.18 | 4.2.2 JDQ39 | 4.2.2 JDQ39 |
请大神给看看到底哪里出了问题,为什么用虚拟机测试成功,用真机测试却总是不成功!