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

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

Что такое флэш-SMS?

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

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

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

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


person xDragonZ    schedule 03.02.2012    source источник
comment
Эй, ты хоть представляешь, что означают остальные три класса? Я ищу около двух часов, но ничего не могу найти.   -  person harshit    schedule 22.10.2012


Ответы (4)


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

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

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

person Scrool    schedule 13.10.2012
comment
Это работает только на ПЗУ CyanogenMod, так как требует подписи APK сертификатами CyanogenMod. - person chuacw; 23.01.2013
comment
Я попытался установить приложение Zero Sms на свой рутированный телефон, но установка не удалась как для подписанного, так и для обычного apk. Будет ли Zero Sms работать только с CyanogenMod? Мне нужно это для версии kitkat - person Viral; 07.08.2014

До Android 2.2 можно было отправлять Flash SMS (это термин для SMS класса 0). 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);

}
person chuacw    schedule 24.02.2012
comment
Хорошо, я выберу это как ответ, так как он не будет работать после Android 2.2. - person xDragonZ; 15.05.2012
comment
Поддерживает ли он последние версии Android? - person Ahmad; 26.12.2019

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

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

используйте 1_

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

использовать (byte) 0x18

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

person Rancid    schedule 13.12.2013

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

person Brian Dupuis    schedule 03.02.2012