我对某些代码有疑问,需要一些帮助。我在这里的代码发送文本...但是我遇到的问题是,接收文本的代码始终返回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/

10-13 03:06