Отправка уникальных смс и получение смс в андроид - PullRequest
2 голосов
/ 13 июня 2011

Поэтому я долго пытался найти способ сделать приложение, которое может отправлять и получать смс в 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. Последняя проблема - это сочетание двух выше.Я не могу отправить смс более 160 символов.Я знаю, что должен использовать sendMultipartTextMessage, но я не знаю как.Я думал, что могу разделить «Строковое сообщение» на 100 в массив, но я не знаю.

Так что не стесняйтесь рефакторинг кода.Я с нетерпением жду ваших ответов!: D Пожалуйста, спросите, если вам нужно что-нибудь объяснил лучше или больше кода!:)

Ответы [ 2 ]

1 голос
/ 13 июня 2011

Не специфично для Android, но читайте о стандарте «Объединенные SMS». По сути, это несколько сообщений, каждое из которых указывает, что они идут вместе с предыдущим, но оно передается по воздуху как полностью независимое SMS.

Большинство телефонов, конечно, скрывают этот факт от пользователя, но если вы непосредственно получаете SMS, скорее всего, вам придется разобраться с ним самостоятельно - отправив и получение. Предполагая, что Android использует этот стандарт, что выглядит как безопасная ставка.

Поскольку это так часто, я уверен, что вы можете найти библиотеку, которую кто-то уже написал.

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

0 голосов
/ 22 августа 2011

Все, что вы просили, находится в коде 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 обязательно поможет вам понять, как это сделать. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...