微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Android中发送唯一的短信并接收looong短信

如何解决在Android中发送唯一的短信并接收looong短信

|| 因此,我已经尝试了很长时间,以找到一种方法来制作可以在android中发送和接收短信的应用。很好这是代码: 发送:
@SuppressWarnings(\"deprecation\")
public void sendSMS(String phoneNumber,String message) {


    String SENT = \"SMS_SENT\";
    String DELIVERED = \"SMS_DELIVERED\";
    int unq = 0;
    Intent sent = new Intent(SENT);
    sent.putExtra(\"unq\",unq);
    Intent delivered = new Intent(DELIVERED);
    delivered.putExtra(\"unq\",unq);

    PendingIntent sentPI = PendingIntent.getbroadcast(this,sent,0);

    PendingIntent deliveredPI = PendingIntent.getbroadcast(this,delivered,0);

    // ---when the SMS has been sent---
    registerReceiver(new broadcastReceiver() {
        @Override
        public void onReceive(Context arg0,Intent arg1) {

            switch (getResultCode()) {
            case Activity.RESULT_OK:
                Toast.makeText(getBaseContext(),\"SMS sent\",Toast.LENGTH_SHORT).show();
                smsstatus = \"0\";
                smserror = \"noError\";
                //sendSmsstatus();
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                Toast.makeText(getBaseContext(),\"Generic failure\",Toast.LENGTH_SHORT).show();
                setSmsstatus(\"1\");
                setSmserror(\"Generic failure\");
                sendSmsstatus(\"Generic failure\");
                break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                Toast.makeText(getBaseContext(),\"No service\",Toast.LENGTH_SHORT).show();
                setSmsstatus(\"2\");
                setSmserror(\"No service\");
                sendSmsstatus(\"No service\");
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                Toast.makeText(getBaseContext(),\"Null PDU\",Toast.LENGTH_SHORT).show();
                setSmsstatus(\"3\");
                setSmserror(\"Null PDU\");
                sendSmsstatus(\"Null PDU\");
                break;
            case SmsManager.RESULT_ERROR_RAdio_OFF:
                Toast.makeText(getBaseContext(),\"Radio off\",Toast.LENGTH_SHORT).show();
                setSmsstatus(\"4\");
                setSmserror(\"Radio off\");
                sendSmsstatus(\"Radio off\");
                break;
            }

        }

    },new IntentFilter(SENT));

    // ---when the SMS has been delivered---
    registerReceiver(new broadcastReceiver() {
        @Override
        public void onReceive(Context arg0,\"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,message,sentPI,deliveredPI);
}
接收:
public class SmsReceiver extends broadcastReceiver {
@SuppressWarnings(\"deprecation\")
@Override
public void onReceive(Context context,Intent intent) {
    // ---get the SMS message passed in---

    Bundle bundle = intent.getExtras();
    SmsMessage[] msgs = null;
    String str = \"\";
    Object sms = \"\";
    ArrayList<String> s = new ArrayList<String>();
    Manager m = Factory.getInstance().getManager();

    if (bundle != null) {
        // ---retrieve the SMS message received---
        Object[] pdus = (Object[]) bundle.get(\"pdus\");
        msgs = new SmsMessage[pdus.length];
        for (int i = 0; i < msgs.length; i++) {
            msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
            str += \"    SMS fra \" + msgs[i].getoriginatingAddress() + \"\\n\";
            str += \"    Besked: \";
            str += msgs[i].getMessageBody().toString();
            str += \"\\n\";
            sms = \"SMS = \"+msgs[i].getoriginatingAddress()+\",\"+msgs[i].getMessageBody().toString();
            s.add(msgs[i].getoriginatingAddress());
            s.add(msgs[i].getMessageBody().toString());
        }
        // ---display the new SMS message---
        Toast.makeText(context,str,Toast.LENGTH_LONG).show();
        Manager.toastIt(context,str);              

        // Send the sms to the server
        //Connection.send(new Transmit(\"SmsReceived\",s));
    }
}
}
这很棒! 问题来了。是否可以重构我的代码以实现以下目标: 在我发送的短信上有一个唯一的标识符/标志,这样我就可以确保自己收到的短信状态。如您所见,我已经尝试在我的2个意图中添加额外的内容,也许这是正确的方法,但不仅现在我不该如何检查/接收/提取状态标志,而且还真的要检查/现在是“唯一”。 我可以审查短信真是太好了,但是当它超过160个字符时,只向我显示前160个字符。我已经看过GTalkSMS的工作方式,但是希望可以将我的代码重构一下:) 最后一个问题是上述2的混合。我无法发送超过160个字符的短信。我知道我必须使用sendMultipartTextMessage,但我不知道如何。我的想法是我可以将\“ String message \”分配给一个Array,但我不知道。 因此,请随时重构代码。我期待着您的回复! :D 请询问您是否需要更好的解释或更多代码! :)     

解决方法

        不是特定于Android的,而是阅读有关“连接的SMS”标准的信息。基本上,它是多条消息,每条消息都指定它们与上一条消息一起使用,但是它作为完全独立的SMS进行广播。 当然,大多数电话都会向用户隐藏这一事实,但是如果您直接接收SMS,则可能需要自己处理-发送和接收。假设Android使用此标准,这似乎是一个安全的选择。 由于它是如此普遍,因此我确定您可以找到已经有人编写的库。 http://en.wikipedia.org/wiki/Concatenated_SMS     ,        您要求的所有内容都在GTalkSMS代码中(似乎您错过了它)。 :-)但是,我将为您指出正确的摘录。 为了使用
sendMultipartTextMessage()
并区分不同的已发送/已传递的通知意图,您首先需要通过ѭ3split拆分消息字符串,并创建两个,一个用于已发送的通知,一个用于已传递的通知,PendingIntents ArrayLists,其中,这是重要的部分,必须使用唯一的请求int创建每个PendingIntent:
PendingIntent.getBroadcast(context,UNIQUE_ID,deliveredIntent,PendingIntent.FLAG_ONE_SHOT)
这样可以确保andoird将为每个发送的传递的通知广播唯一的意图。您还可以在意图中添加一些其他功能,以便稍后可以告诉您通知所针对的SMS。 可以在此处找到代码段:
sendSMSByPhoneNumber()
确保您的SmsReceiver知道传入的意图可以包含多个发件人的多个SMS,但最多包含nbfOfpdus个不同的发件人。 GTalkSMS接收器一定会帮助您了解如何进行此操作。 :)     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。