SMS-сообщение класса 0 (флэш-SMS) на Android

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

Что такое SMS?

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

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

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

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

+10
источник поделиться
4 ответа

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

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

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

+8
источник

До 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);

}
+6
источник

Scrool ответ действительно правильный, qaru.site/questions/346184/..., поскольку ZeroSMS действительно отправляет flash-сообщения; однако это Proof-of-Concept и поддерживает только SMS с 7-битным кодированием.

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

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

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

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

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

+2
источник

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

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос