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);