我对某些代码有疑问,需要一些帮助。我在这里的代码发送文本...但是我遇到的问题是,接收文本的代码始终返回RESULT_OK ...我可以关闭电话/尝试输入我知道不是真实的数字,并且它将始终返回RESULT_OK ...谁能按正确的方向帮助我,是否有明显的错误?我使用了错误的代码吗?任何帮助将是巨大的!谢谢
收到文字时的代码:
块引用
Globals.GlobalContext.registerReceiver(new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent arg1)
{
switch (getResultCode())
{
case Activity.RESULT_OK:
Globals.UpdateStatus("Message was delivered");
Bundle extras = arg1.getExtras();
if (extras != null)
{
arg1.getStringExtra("smsNumber");
String number = arg1.getStringExtra("smsNumber");
Globals.UpdateStatus("Delivered to :" + number);
arg1 = null;
}
else
{
Globals.UpdateStatus("Sent to a number that I don't know :(");
}
break;
case Activity.RESULT_CANCELED:
Globals.UpdateStatus("Message was NOT delivered");
break;
}
}
}, new IntentFilter(DELIVERED));
发送我的文本的代码:
public void SendTextMessageDelivery(String number, String Message)
{
if ((CheckValidPhoneNumber(number)) && (Message.length() != 0))
{
if (!CheckSMSManager())
{
StartSMSManager(true);
}
//sent
PendingIntent sentPI = PendingIntent.getBroadcast(Globals.GlobalContext, 0, new Intent(SENT), 0);
ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>();
sentIntents.add(sentPI);
//delivered
Intent DeliveredIntent = new Intent(DELIVERED);
DeliveredIntent.putExtra("smsNumber", number);
PendingIntent DeliveredPI = PendingIntent.getBroadcast(Globals.GlobalContext, 0, DeliveredIntent, PendingIntent.FLAG_UPDATE_CURRENT );
ArrayList<PendingIntent> DeliveredIntents = new ArrayList<PendingIntent>();
DeliveredIntents.add(DeliveredPI);
ArrayList<String> mSMSMessage = smsManager.divideMessage(Message);
for (int i = 0; i < mSMSMessage.size(); i++)
{
}
smsManager.sendMultipartTextMessage(number, null, mSMSMessage, sentIntents, DeliveredIntents);
}
else
{
if (Message.length() != 0)
{
Globals.UpdateStatus("Message was not long enough!");
}
else
{
Globals.UpdateStatus("Failed to Validate Mobile Number");
}
}
}
最佳答案
有几种原因可能导致您得到不正确的结果。首先,检查getResultCode()
不是确定交付成功或失败的正确方法。尽管许多示例都使用此方法,但真正的结果将是从服务中心返回并传递到接收器的SMS状态消息。
交给接收方的Intent
将附加一个PDU,作为额外的附件。必须由此创建一个SmsMessage
,并且从其getStatus()
方法返回的值将是实际结果。例如,您的交付结果接收方可能类似于以下内容(尽管最好将多余的内容交给Service
进行处理)。
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.provider.Telephony;
import android.telephony.SmsMessage;
public class DeliveryResultReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
SmsMessage sms = null;
byte[] pdu = intent.getByteArrayExtra("pdu");
String format = intent.getStringExtra("format");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && format != null) {
sms = SmsMessage.createFromPdu(pdu, format);
}
else {
sms = SmsMessage.createFromPdu(pdu);
}
int statusCode = sms.getStatus();
String status = translateDeliveryStatus(statusCode);
...
}
String translateDeliveryStatus(int statusCode) {
switch (statusCode) {
case Telephony.Sms.STATUS_COMPLETE:
return "Sms.STATUS_COMPLETE";
case Telephony.Sms.STATUS_FAILED:
return "Sms.STATUS_FAILED";
case Telephony.Sms.STATUS_PENDING:
return "Sms.STATUS_PENDING";
case Telephony.Sms.STATUS_NONE:
return "Sms.STATUS_NONE";
default:
return "Unknown status code";
}
}
}
如果在执行此操作后仍收到误报,则可能是由于运营商如何定义“已交付”。交付可能并不意味着交付到目标设备。确切的行为因提供商而异,甚至到服务中心级别也不同。以下内容可能并非来自best source,但正如我所见,它简明扼要:
某些提供程序允许用户通过大多数现代电话的SMS设置或通过在每条消息前面加上* 0#或* N#来请求传递报告。但是,确认的确切含义有所不同,从到达网络到排队等待发送,一直到从目标设备接收接收确认,通常不会通知用户所报告的特定成功类型。
关于android - Android-文字交付总是返回结果确定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24734757/