Класс 0 SMS (flash SMS) на Android - PullRequest
       11

Класс 0 SMS (flash SMS) на Android

12 голосов
/ 03 февраля 2012

Поскольку я знаю, что Nokia и некоторые другие телефоны (например, iPhone) могут отправлять и получать SMS-сообщения класса 0, возможно ли это для Android?Есть ли у Android API?

Что такое Flash SMS?

Flash SMS - это SMS, которое отображается на экране телефона сразу по прибытии.

Если вы не решите сохранить флэш-сообщение, оно исчезнет после перехода, и не будет сохранено в вашем почтовом ящике.

Если несколько флэш-сообщений отправляются на один телефон, только самые последниесообщение будет отображаться, и все предыдущие будут перезаписаны.

Класс 0 : Указывает, что это сообщение должно быть отображено на MS немедленно и должен быть отправлен отчет о доставке сообщения.обратно в СЦ.Сообщение не нужно сохранять в MS или на SIM-карте (если это не выбрано мобильным пользователем).

Ответы [ 4 ]

9 голосов
/ 13 октября 2012

Для рутированного Android можно обойти API и отправить SMS класса 0. На Git Hub есть проект под названием ZeroSMS :

ZeroSMS является проверкой концепции, демонстрирующей способ отправки SMS класса 0 на Android> = 2.3.

Примечание: это работает только в версиях 2.2 -> 4.1.2, метод sendRawPdu был удален, поэтому вам нужно найти новый способ сделать это.

6 голосов
/ 24 февраля 2012

Можно было отправить Flash SMS (это термин для SMS класса 0) до Android 2.2.Google удалил API sendRawPdu, поэтому, даже если вы использовали отражение, вы не сможете это сделать.

Вот как я это делал ранее (это было протестировано на Android 1.6 и работало)

private void sendSms(String phone, String sms) {
    if ((phone == null) || (sms == null) || (phone.length() == 0)
            || (sms.length() == 0)) {
        String message = "Phone or message empty!!!";
        Toast notification = Toast.makeText(getBaseContext(), message,
                Toast.LENGTH_SHORT);
        notification.show();
        return;
    }

    // SecurityManager oldSM = System.getSecurityManager();
    // MySecurityManager newSM = new MySecurityManager();
    // System.setSecurityManager(newSM);

    // ServiceManager.getService("isms")
    // ServiceManager.getService("isms");

    SmsManager m = SmsManager.getDefault();
    PendingIntent sentIntent = PendingIntent
            .getBroadcast(this, 0, new Intent(
                    MessageStatusReceiver_MESSAGE_STATUS_RECEIVED_ACTION),
                    0);

    PendingIntent deliveryIntent = PendingIntent.getBroadcast(this, 0,
            new Intent(SmsReceiverService_MESSAGE_SENT_ACTION), 0);

    // String sms = "Message self-destroyed!!!";
    // String phone = "93634096";

    long NOW = System.currentTimeMillis();
    String time = String.valueOf(NOW);

    // // m.sendTextMessage(phone, null, sms, sentIntent, deliveryIntent);
    // working // m.sendTextMessage(phone, null, sms, null, null);
    byte[] bb = new byte[1];
    Method m2 = null;
    try {
        m2 = SmsManager.class.getDeclaredMethod("sendRawPdu",
                bb.getClass(), bb.getClass(), PendingIntent.class,
                PendingIntent.class);
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    // send message

    SmsMessage.SubmitPdu pdus = SmsMessage.getSubmitPdu(null, phone, sms,
            false);

    // http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=telephony/java/android/telephony/gsm/SmsMessage.java;h=9ccfa90d2e24e5caea26c1deac641b3c31ae56d4;hb=c883b143ba2b8bfe2f2033d00dee9ff733f1b59c

    boolean submitted = false;
    try {
        byte[] encodedMessage = pdus.encodedMessage;
        // byte[0] = mtiByte
        // byte[1] = TP Message Reference
        // byte[2] = length of source phone
        // byte[3..length] = phone
        // protocol identifier
        int msgLen = encodedMessage[2] / 2;
        // +2 -> length of source phone
        // +2 -> for 91 after the length
        // +1 -> TP PID
        int indexTPDCS = msgLen + 5;
        byte TPDCS = encodedMessage[indexTPDCS];
        // System.out.println(TPDCS);
        System.out.println(getHexString(encodedMessage));
        byte[] changedMessage = encodedMessage.clone();
        // Set bit 4 to 1 using OR (|), indicating there is a message class
        // Set bit 0 and 1 to 0 using AND (&), indicating class 0
        byte newTPDCS = (byte) ((TPDCS | 0x10) & 0xFC); // Flash SMS
        changedMessage[indexTPDCS] = newTPDCS; // Class 0
        System.out.println(getHexString(changedMessage));
        // Log.d(SmsScheduler_TAG, getHexString(changedMessage));
        boolean send = true;
        if (send) {
            m2.invoke(m, pdus.encodedScAddress, changedMessage, null, null);

            // sendSMS(HexDump.bytesToHexString(pdus.encodedScAddress),
            // HexDump.bytesToHexString(changedMessage), null);

            String message = "Flash SMS sent to " + phone
                    + " successfully!";
            Toast notification = Toast.makeText(getBaseContext(), message,
                    Toast.LENGTH_SHORT);
            notification.show();
            Log.d(SmsScheduler_TAG, message);
            submitted = true;
        }
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

            // not essential, saves the SMS sent. 
    if (submitted) {
        ContentValues values = new ContentValues();
        values.put(ADDRESS, phone);
        values.put(DATE, time);
        values.put(READ, 0);
        values.put(STATUS, -1);
        values.put(TYPE, MESSAGE_TYPE_SENT);
        values.put(BODY, sms);

        Uri inserted = getContentResolver().insert(
                Uri.parse("content://sms"), values);
    }

    // System.setSecurityManager(oldSM);

}
2 голосов
/ 13 декабря 2013

Scrool действительно верный ответ, https://stackoverflow.com/a/12873325/3082310, поскольку ZeroSMS отправляет флеш-SMS;тем не менее, это подтверждение концепции и поддерживает только SMS с 7-битной кодировкой.

Для правильного кодирования кажется, что есть необходимость изменить код и добавить операторы if-then или switch-case:Для 7-битного кодирования, как на английском

, используйте (byte)0xF0

Для 16-битного кодирования UCS-2

используйте (byte) 0x18

В противном случае, если вы вводите неподдерживаемый язык, появляются ненужные символы.

0 голосов
/ 03 февраля 2012

Да и нет. Возможно ли легко ? Нет. Это технически возможно с дурачеством (читай: отражение)? Обычно .

...