web-dev-qa-db-fra.com

Classe SMS (flash SMS) sur Android

Comme je sais que Nokia et certains autres téléphones (comme l'iPhone) peuvent envoyer et recevoir la classe 0 SMS, est-ce possible pour Android? Android a-t-il l'API?

Qu'est-ce qu'un flash SMS?

Flash SMS est un SMS qui s'affiche sur l'écran du téléphone dès son arrivée.

À moins que vous ne choisissiez d'enregistrer le message flash, celui-ci disparaîtra lors de la navigation et ne sera pas enregistré dans votre boîte de réception.

Si plusieurs messages flash sont envoyés à un seul téléphone, seul le dernier message sera affiché et tous les précédents seront écrasés.

Classe 0 : indique que ce message doit être affiché immédiatement sur la mémoire de messages et qu'un rapport de remise de message doit être renvoyé au SC. Il n'est pas nécessaire que le message soit enregistré dans la MS ou sur la carte SIM (à moins que l'utilisateur mobile ne l'ait sélectionné). 

10
xDragonZ

Pour Android rooté, il est possible de contourner une API et d’envoyer des SMS de classe 0. Il y a un projet sur Git Hub appelé ZeroSMS :

ZeroSMS est une preuve de concept montrant un moyen d'envoyer la classe 0 SMS sur Android> = 2.3.

Remarque: cela ne fonctionne que sur les versions 2.2 -> 4.1.2. La méthode sendRawPdu a été supprimée.

9
Scrool

Il était possible d'envoyer Flash SMS (c'est le terme utilisé pour les SMS de classe 0) avant Android 2.2 . Google avait supprimé l'API sendRawPdu. Par conséquent, même si vous utilisiez la réflexion, vous ne pourriez pas le faire.

Voici comment je l'ai fait auparavant (cela a été testé sur Android 1.6 et a fonctionné)

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

La réponse de Scrool est en effet correcte, https://stackoverflow.com/a/12873325/3082310 , comme ZeroSMS n'envoie des SMS flash; Cependant, il s'agit d'une Proof-of-Concept et ne prend en charge que les SMS avec codage 7 bits.

Pour un codage correct, il semble nécessaire de modifier le code et d’ajouter des instructions if-then ou switch-case: Pour un codage à 7 bits, comme en anglais

utiliser (byte)0xF0

Pour le codage 16 bits, codage UCS-2

utiliser (byte) 0x18

Sinon, les caractères indésirables apparaissent si vous entrez une langue non prise en charge.

2
Rancid

Oui et non. Est-ce facilement possible? Non. Est-ce techniquement possible avec tomfoolery (lire: réflexion)? Habituellement

0
Brian Dupuis