安卓短信发送状态

3

我需要在我的安卓应用程序中实现发送短信的功能。我找到了许多相关的教程,但是无法获得已送达状态(失败或成功)。以下是我的短信方法。

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

我正在使用我的谷歌Nexus 4手机检查,并成功接收了短信信息。
我发送成功的短信消息,但是却没有收到“SMS已发送”和“SMS已送达”的消息,即使我将消息发送到不同的号码。
当我使用模拟器进行检查时,也出现了相同的情况(显示“SMS已发送”,但未显示传递状态消息“SMS未传递”)。
在清单文件中,我已添加了权限。
 <uses-permission android:name="android.permission.RECEIVE_SMS" />

同时,我的开发SDK版本如下。
<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="21" />

有人知道我哪里做错了,导致无法获取交付状态吗?根据我的代码,应该会出现"SMS delivered"或"SMS not delivered"的消息。提前感谢!

编辑

同时,在清单文件中添加了短信发送权限。之前没有在问题中提到...

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

并非每个服务提供商都提供短信的传送报告。尝试在另一个提供商的设备上测试您的代码。如果您在美国,我相信Verizon是其中之一。 - Mike M.
你的意思是完全取决于连接服务提供商是否支持此功能。这种方式无法向客户提供消息是否成功传递的指示?例如,Android模拟器没有连接时显示“短信已发送”消息,但不显示“短信未传递”消息。因此,应用程序用户可能会认为消息已传递。 - JibW
“你的意思是完全取决于连接服务提供商是否支持此功能。” - 没错。有些支持,有些不支持。例如,我的不支持。我真的不知道消息是否已经被送达,直到收件人回复。如果你的应用程序确实收到了送达报告,那么它可以指示这一点,但你不能依赖在任何给定的设备/网络上都能得到一个送达报告。 - Mike M.
进一步澄清一下,交付报告必须来自网络。如果设备没有从网络接收到交付报告,则您的“deliveredPI”无论是否已交付,都不会触发。 - Mike M.
1个回答

0
将此权限添加到您的清单文件中:
<uses-permission android:name="android.permission.SEND_SMS"/>

抱歉,我也添加了sms_send权限。在问题中错误地提到了其他一个权限是为了测试而添加的。因此那不是情况。 - JibW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接