Android - 已发送的文本始终返回RESULT OK

时间:2014-07-14 10:44:18

标签: android sms

我遇到了一些代码问题,需要一些帮助。我在这里的代码发送了一个文本......但我遇到的问题是接收文本的代码ALWAYS返回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");
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您可能会收到不正确的结果有几个原因。首先:检查getResultCode()不是确定交付成功或失败的正确方法。虽然许多示例使用此方法,但真正的结果将是从服务中心返回的SMS状态消息,并传递到接收器。

递交给您的Receiver的Intent将附加一个附加的PDU。必须从此创建SmsMessage,并且从getStatus()方法返回的值将是实际结果。例如,您的投放结果Receiver可能类似于以下内容(尽管最好将额外内容交给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,但它如我所见,它简洁明了:

  

某些提供商允许用户通过大多数现代手机的短信设置或每个短信前缀* 0#或* N#来请求发送报告。但是,确认的确切含义各不相同,包括到达网络,排队等待发送,发送,接收目标设备的接收确认,用户通常不会被告知报告的特定成功类型。 / p>