在android中发送独特的短信并接收looong短信

时间:2011-06-13 19:49:12

标签: android sms

所以我已经尝试了很长时间找到一种方法来创建一个可以在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, 0, sent, 0);

    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,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, 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, 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));
    }
}
}

这很棒!。

这就是问题所在。是否可以重构我的代码以实现以下目的:

  1. 在我的发送短信上有一个唯一的标识符/标志,这样我就可以确定哪些短信我收到了状态。正如你所看到的,我已经尝试过额外的2个意图,也许这是正确的方法,但不仅我现在不是如何检查/接收/提取状态的标志,而且标志真的“独一无二的“现在。

  2. 很好,我可以修改短信,但是当它超过160个字符时,它只显示我的前160个字符。我曾经看过GTalkSMS是如何做到这一点的,但我希望我的代码可以稍微重构一下:)

  3. 最后一个问题是,上述2的混合。我不能发送超过160个字符的短信。我知道我必须使用sendMultipartTextMessage,但我不知道如何。我的想法是,我可以将“字符串消息”100除以数组,但我不知道。

  4. 所以请随意重构代码。我很期待看到你的回复! :d 请询问您是否需要更好的解释或更多代码! :)

2 个答案:

答案 0 :(得分:1)

不是针对Android的,但请阅读“串联短信”标准。基本上它是多条消息,每条消息都指定它们与前一条消息一起使用,但它作为完全独立的SMS进行播出。

当然,大多数手机都会向用户隐瞒这一事实,但如果您直接接收短信,则可能需要自行处理 - 发送接收。假设Android使用这个标准,这似乎是一个安全的赌注。

因为它很常见,所以我相信你可以找到一个已经写过的图书馆。

http://en.wikipedia.org/wiki/Concatenated_SMS

答案 1 :(得分:0)

您要求的所有内容都在GTalkSMS代码中(似乎您错过了它)。 :-)但我会指出你正确的片段。

为了使用sendMultipartTextMessage()并区分不同的已发送/已发送通知意图,您首先需要通过SmsManager.divideMessage(message)拆分消息字符串并创建两个,一个用于发送通知,另一个用于已发送的通知, PendingIntents ArrayLists,其中,,这是重要的部分,每个PendingIntent都必须使用唯一的请求int创建:

PendingIntent.getBroadcast(context, UNIQUE_ID, deliveredIntent, PendingIntent.FLAG_ONE_SHOT)

这可确保andoird将为每个已发送的通知广播唯一意图。您还可以为意图添加一些额外内容,稍后可以告诉您通知的SMS。 代码段可在此处找到:sendSMSByPhoneNumber()

确保您的SmsReceiver知道传入的意图可以包含多个发件人的一条SMS,但最多包含nbfOfpdus不同的发件人。 GTalkSMS接收器肯定会帮助您了解如何实现这一目标。 :)