【问题标题】:Android SMS Delivery StatusAndroid 短信发送状态
【发布时间】:2015-05-19 13:28:30
【问题描述】:

我需要在我的 android 应用程序中实现一个功能来发送短信。我找到了很多关于此的教程,但无法获得交付状态(失败或正常)。以下是我的短信方法。

 private void sendSmsMessageWithStatus(String phoneNumber, String Msg)
 {
     String SENT = "SMS_SENT";
     String DELIVERED = "SMS_DELIVERED";

     PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
     PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);

     registerReceiver(new BroadcastReceiver()
     {
        @Override
        public void onReceive(Context context, Intent intent) 
        {
            switch (getResultCode())
            {
                case Activity.RESULT_OK:
                    Toast.makeText(getBaseContext(), "SMS sent", Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    Toast.makeText(getBaseContext(), "Generic failure", Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:
                    Toast.makeText(getBaseContext(), "No service", Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU:
                    Toast.makeText(getBaseContext(), "Null PDU", Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF:
                    Toast.makeText(getBaseContext(), "Radio off", Toast.LENGTH_SHORT).show();
                    break;
            }               
        }

     }, new IntentFilter(SENT));

     registerReceiver(new BroadcastReceiver()
     {
        @Override
        public void onReceive(Context arg0, Intent arg1)
        {
            switch (getResultCode())
            {
                case Activity.RESULT_OK:
                    Toast.makeText(getBaseContext(), "SMS delivered", Toast.LENGTH_SHORT).show();
                    break;
                case Activity.RESULT_CANCELED:
                    Toast.makeText(getBaseContext(), "SMS not delivered", Toast.LENGTH_SHORT).show();
                    break;                        
            }
        }
     }, new IntentFilter(DELIVERED)); 

     SmsManager sms = SmsManager.getDefault();
     sms.sendTextMessage(phoneNumber, null, Msg, sentPI, deliveredPI);     
 }

我正在使用我的 google nexus 4 手机进行检查,并获得了正确发送的短信。

我收到消息“SMS 已发送”消息,但即使我成功向其他号码发送消息,也从未收到“SMS 已发送”消息。

当我使用模拟器检查时也是同样的事情(显示“SMS 已发送”消息,但不显示传递状态消息“SMS 未传递”)。

在清单文件中我添加了权限

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

还有我的开发SDK版本如下。

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="21" />

没有人知道我做错了什么没有获得交货状态。根据我的代码“SMS 已发送”或“SMS 未发送”消息。提前谢谢!!!

编辑

短信发送权限也已添加到清单中。错过了有问题的提及...

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

【问题讨论】:

  • 并非每个服务提供商都提供 SMS 的发送报告。尝试在其他提供商的设备上测试您的代码。如果您在美国,我相信 Verizon 就是这样。
  • 您的意思是这完全取决于连接服务提供商来支持此功能。所以这种方式不能让客户知道消息是否成功传递?例如,没有连接的 android 模拟器显示“SMS 已发送”消息,但不显示“SMS 未发送”消息。因此,应用用户可以认为消息已传递。
  • “你的意思是这完全取决于连接服务提供商来支持这个功能。” - 确切地。有些会,有些不会。例如,我的没有。在收件人回复之前,我真的不知道消息是否已送达。如果您的应用确实收到了一份交付报告,那么它可以表明同样的情况,但您不能指望在任何给定的设备/网络上获得一份。
  • 为了进一步澄清,交付报告必须来自网络。如果设备没有从网络接收到一个,你的deliveredPI 将不会触发,无论它是否已交付。

标签: android sms


【解决方案1】:

将此权限添加到您的清单中:

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

【讨论】:

  • 操作。抱歉,我也添加了 sms_send 权限。错误地提到了为测试添加的另一个。因此,情况并非如此。
猜你喜欢
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
相关资源
最近更新 更多