Android &引用;“真正的”;短信接收机的测试
我有一个Android &引用;“真正的”;短信接收机的测试,android,android-intent,sms,broadcastreceiver,Android,Android Intent,Sms,Broadcastreceiver,我有一个SmsReceiver,我想在一台设备上测试它,但是我不愿意向我的设备发送一堆真正的短信,这些短信会堆积我的电话账单;-) 所以我想,我必须能够用收到的短信、短信数据和发送短信所需的所有其他东西来激发意图。在谷歌上快速浏览之后,我来到这里:。 我从这篇文章中汲取了一些想法,制作了我的杀手安卓应用程序,用于在设备上创建和“发送”短信,以供测试之用。我必须说,它工作起来很有魅力,除了我的接收者onReceive没有被调用,发送的短信直接进入收件箱。我知道我的接收器可以工作,如果我向我的设备发
SmsReceiver
,我想在一台设备上测试它,但是我不愿意向我的设备发送一堆真正的短信,这些短信会堆积我的电话账单;-)
所以我想,我必须能够用收到的短信、短信数据和发送短信所需的所有其他东西来激发意图。在谷歌上快速浏览之后,我来到这里:。
我从这篇文章中汲取了一些想法,制作了我的杀手安卓应用程序,用于在设备上创建和“发送”短信,以供测试之用。我必须说,它工作起来很有魅力,除了我的接收者onReceive
没有被调用,发送的短信直接进入收件箱。我知道我的接收器可以工作,如果我向我的设备发送一条真正的短信,它就会触发,如果我从DDMS向模拟器发送一条短信,它也会触发,所以这应该没问题
那么,是否有任何权限
、一些意图、putExtras
或其他我错过的东西?任何提示都是非常有帮助的,如果a能让它发挥作用,它将对我的应用程序的测试和开发有很大帮助
我的舱单接收人:
<receiver android:name=".SmsReceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
清单中的权限(接收应用程序):
清单中的权限(发送应用程序):
还应该提到的是,LogCat或控制台中没有显示错误。这是我的接收器在清单中的样子:
<receiver android:name="com.mike.broadcastexample.BroadcastReceiverClass" android:exported="true" >
<intent-filter android:priority="999" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
我要做的唯一额外的事情是将安卓:优先级设置为999,并添加了安卓:exported=“true”
以下是我对该应用程序使用的唯一权限:
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
我的应用程序也有同样的问题,那是HTC ONE,它有安卓4.3,但在对这个接收器做了一些改动后,它的工作绝对完美
你也可以试试看 使用以下接收方声明,同时确保您的SMsReceiver存在于主包中,或者提供完整路径“*路径/SMsReceiver*”此处路径指完整的包路径
<receiver
android:name=".SmsReceiver"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS" >
<intent-filter android:priority="5822" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
此外,所有权限似乎都很好,只是如果你发送短信太多,只是包括
<uses-permission android:name="android.permission.SEND_SMS" />
我想说这里有三种可能性,每种可能性都有自己的用例和真实性级别
首先,显然,你可以向手机发送真正的短信。如果你目前的电话计划不充分,你可以考虑买一个便宜的预付费SIM卡,并有一个很好的短信价格协议。另一种选择是使用,这可能比使用真正的设备更便宜、更方便
第二,在模拟器上或通过ADB在真实设备上进行测试。据我所知,这应该和收到真正的短信“一样”。它的好处当然是免费的,而且非常方便,因为它允许您比在设备上更轻松地操作SMS参数
< P >第三,一旦您对上述两个测试级别感到满意,请考虑实际发送和接收实际<代码> SMSI接收广播的替代方案可能是将您的大部分逻辑从OnRead()/<代码>分解为另一种方法,然后可以手动调用。p>
SmsBroadCastReceiver.java
然后,您可以通过调用
new SmsBroadcastReceiver().handleSmsMessageData(this, data);
以及从应用程序中传递所需的任何数据
所以,概括一下,前两个测试级别处理的是以不同程度的真实性测试基本的SMS解析逻辑,第三个测试级别是一种更抽象的方法,用于测试BroadcastReceiver在解析接收到的SMS后实际执行的操作。不,我使用的是Jelly Bean(想想API lvl.16),无论如何,谢谢。如果我能用这种方式“真实地”测试我的接收器,那就太好了谢谢,我会非常感激的!当它“应该工作”但不工作时,这很烦人;-)你曾经解决过这个问题吗?仍然没有成功,现在用exported='true'扩展了我的接收器,并将优先级设置为999,但仍然失败。好的。。我有一个问题,为什么要这样做?“你的接收者看起来和我发布的答案一模一样吗?”?
<uses-permission android:name="android.permission.SEND_SMS" />
public class SmsBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "SmsBroadcastReceiver";
public class SmsMessageData{
public String body;
public String sender;
public long timestamp;
}
public void onReceive(final Context context, Intent intent) {
SmsMessageData data = parseSmsMessage(intent.getExtras());
handleSmsMessageData(context, data);
}
public void handleSmsMessageData(Context context, SmsMessageData data) {
// Do what you want with the data, for example store it in your database
// and show a notification. Note that data might be null!
}
private SmsMessageData parseSmsMessage(Bundle intentExtras) {
if (intentExtras != null) {
Object[] smsArray = (Object[]) intentExtras.get("pdus");
if (smsArray != null) {
String format = intentExtras.getString("format");
StringBuilder body = new StringBuilder("");
String sender = "";
long timestamp = System.currentTimeMillis();
for (Object sms : smsArray) {
android.telephony.SmsMessage smsMessage = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? android.telephony.SmsMessage.createFromPdu((byte[]) sms, format) : android.telephony.SmsMessage.createFromPdu((byte[]) sms);
body.append(smsMessage.getMessageBody());
sender = smsMessage.getOriginatingAddress();
timestamp = smsMessage.getTimestampMillis();
}
SmsMessageData result = new SmsMessageData();
result.body = String.valueOf(body);
result.sender = sender;
result.timestamp = timestamp;
return result;
}
}
return null;
}
}
new SmsBroadcastReceiver().handleSmsMessageData(this, data);