【发布时间】: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将不会触发,无论它是否已交付。