【问题标题】:"Real" testing of sms receiver短信接收器的“真实”测试
【发布时间】:2014-03-10 20:50:58
【问题描述】:

我有一个SmsReceiver,我想在设备上测试它的真实性,但是我不愿意向我的设备发送一堆真实的短信来堆积我的电话费;-)

所以我认为我必须能够使用动作RECEIVED_SMS、短信数据和发送短信所需的所有其他内容来启动intent。在谷歌上快速浏览后,我最终来到了这里:http://blog.dev001.net/post/14085892020/android-generate-incoming-sms-from-within-your-app。 我从这篇文章中汲取了一些想法,并制作了我的杀手级 android 应用程序,用于在设备上创建和“发送”短信以进行测试,我必须说它就像一个魅力,除了我的接收器 onReceive 没有被调用,发送的短信直接进入收件箱。我知道我的接收器可以工作,如果我向我的设备发送一条真实的短信,它会触发,如果我从 DDMS 向模拟器发送一条短信,它也会触发,所以应该没问题。

那么有没有我想念的permissions、一些Intent.putExtras 或其他东西?任何提示都非常有帮助,如果能够让它发挥作用,它将在测试和开发我的应用程序时帮助我很多。

清单中的我的接收器:

<receiver android:name=".SmsReceiver">
     <intent-filter android:priority="1000"> 
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
     </intent-filter> 
</receiver>

清单中的权限(接收应用程序):

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />  

清单中的权限(发送应用程序):

<uses-permission android:name="android.permission.BROADCAST_SMS"/>

还应该提到 LogCat 或控制台中没有显示任何错误。

【问题讨论】:

  • 不,我正在使用 Jelly Bean(想想 API lvl.16),无论如何,谢谢。如果我能以这种方式“真正地”测试我的接收器,那就太好了
  • 谢谢,非常感谢!当它“应该工作”但没有工作时,这很烦人;-)
  • 你解决过这个问题吗?

标签: android android-intent sms broadcastreceiver


【解决方案1】:

这是我的接收器在清单中的样子:

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

我唯一要做的就是将 android:priority 设置为 999 并添加了 android: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" />

我的应用程序也遇到了同样的问题,它是具有 Android 4.3 的 HTC ONE,但在对此接收器进行了一些更改后,它的工作绝对完美。

你也可以试试。

【讨论】:

  • 在这方面仍然没有成功,现在已经用exported='true'扩展了我的接收器并将优先级设置为999,但仍然失败。
  • 好吧..不过我有一个问题..为什么这个权限?""
  • 你的接收器看起来和我发布答案的方式一模一样吗?
【解决方案2】:

使用以下接收者声明还确保您的 SMsReceiver 存在于主包中,否则提供完整路径“*path/SmsReceiver* " 这里的 path 表示完整的包路径。

 <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" />

【讨论】:

    【解决方案3】:

    我想说这里有三种可能性,每种都有自己的用例和真实性级别。

    首先,很明显,您可以向手机发送真正的 SMS 消息。如果您当前的电话套餐不够用,请考虑购买具有良好 SMS 价格优惠的廉价预付费 SIM 卡。另一种选择是use Skype to send SMS,这可能比使用真实设备更便宜、更方便。

    其次,在模拟器上或通过 ADB 在您的真实设备上进行测试。据我所知,这与接收真正的短信“相同”。好处当然是它是免费的,而且非常方便,因为它可以让您比在设备上更轻松地操作 SMS 参数。

    第三,一旦您对上述两个测试级别感到满意,请考虑实际发送和接收真实SMS_RECEIVED 广播的替代方法可能是将您的大部分逻辑从onReceive() 分解为另一种方法,您可以然后手动调用。

    SmsBroadCastReceiver.java

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

    并从应用程序中传递您需要的任何数据。

    因此,回顾一下,前两个测试级别用于测试您的基本 SMS 解析逻辑,具有不同程度的真实性,第三个级别是测试您的 BroadcastReceiver 解析后实际执行的任何操作的更抽象方式收到的短信。

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多