wake-up-neo.com

Klasse SMS (Flash-SMS) auf Android

Da ich weiß, dass Nokia und einige andere Telefone (wie iPhone) Klasse 0 SMS senden und empfangen können, ist es für Android möglich? Haben Android die API?

Was ist Flash-SMS?

Flash SMS ist eine SMS, die unmittelbar nach der Ankunft auf dem Telefonbildschirm angezeigt wird.

Wenn Sie die Flash-Nachricht nicht speichern möchten, verschwindet sie beim Navigieren und wird nicht in Ihrem Posteingang gespeichert.

Wenn mehrere Flash-Nachrichten an ein Telefon gesendet werden, wird nur die letzte Nachricht angezeigt und alle vorherigen werden überschrieben.

Klasse 0 : Gibt an, dass diese Nachricht sofort in der MS angezeigt werden soll und ein Nachrichtenübermittlungsbericht an den SC zurückgesendet werden soll. Die Nachricht muss nicht in der MS oder auf der SIM-Karte gespeichert werden (es sei denn, der mobile Benutzer wählt dies aus). 

10
xDragonZ

Bei gerooteten Android-Geräten ist es möglich, eine API zu umgehen und SMS der Klasse 0 zu senden. Auf Git Hub gibt es ein Projekt namens ZeroSMS :

ZeroSMS ist ein Proof-of-Concept, der zeigt, wie Klasse 0 SMS auf Android> = 2.3 gesendet werden kann.

Hinweis: Dies funktioniert nur bei den Versionen 2.2 -> 4.1.2. Die sendRawPdu-Methode wurde entfernt. Sie müssen also einen neuen Weg finden.

9
Scrool

Es war möglich, Flash SMS (das ist die Bezeichnung für SMS der Klasse 0) vor Android 2.2 zu senden. Google entfernte die sendRawPdu-API. Selbst wenn Sie Reflection verwenden, können Sie dies nicht tun.

So habe ich es zuvor gemacht (dies wurde auf Android 1.6 getestet und hat funktioniert)

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
chuacw

Scrool s Antwort ist in der Tat richtig, https://stackoverflow.com/a/12873325/3082310 , da ZeroSMS Flash-SMS sendet; Es ist jedoch ein Proof-of-Concept und unterstützt nur SMS mit 7-Bit-Kodierung.

Für eine korrekte Kodierung scheint es notwendig zu sein, den Code zu ändern und wenn-dann- oder Fall-Anweisungen-Anweisungen hinzuzufügen: Für die 7-Bit-Kodierung, wie auf Englisch

verwenden Sie (byte)0xF0

Für die 16-Bit-Codierung die UCS-2-Codierung

verwenden Sie (byte) 0x18

Andernfalls werden Junk-Zeichen angezeigt, wenn Sie eine nicht unterstützte Sprache eingeben.

2
Rancid

Ja und nein. Ist es leicht möglich? Nein. Ist es mit Tomfoolery technisch möglich (sprich: Reflektion)? Normalerweise .

0
Brian Dupuis