Android 上的 0 类 SMS(闪存 SMS)

Posted

技术标签:

【中文标题】Android 上的 0 类 SMS(闪存 SMS)【英文标题】:Class 0 SMS (flash SMS) on Android 【发布时间】:2012-02-25 17:52:25 【问题描述】:

据我所知,诺基亚和其他一些手机(如 iPhone)能够发送和接收 0 类短信,android 可以吗? Android 有 API 吗?

什么是闪信?

Flash SMS 是一种在到达时立即显示在手机屏幕上的短信。

除非您选择保存 Flash 消息,否则它会在您离开时消失,并且不会保存在您的收件箱中。

如果向一部手机发送多条闪信,则只会显示最新的消息,之前的所有消息都会被覆盖。

Class 0:表示此消息将立即显示在 MS 上,并将消息传递报告发送回 SC。消息不必保存在 MS 或 SIM 卡中(除非移动用户选择这样做)。

【问题讨论】:

嘿,你知道其他三个类是什么意思吗?我已经搜索了大约两个小时,但我找不到任何东西。 【参考方案1】:

对于 root 的 Android,可以绕过 API 并发送 Class 0 SMS。 Git Hub 上有一个项目叫ZeroSMS:

ZeroSMS 是一个概念验证,展示了一种在 android >=2.3 上发送 Class 0 SMS 的方法。

注意:这仅适用于版本 2.2 -> 4.1.2,sendRawPdu 方法已被删除,因此您需要找到一种新方法来执行此操作。

【讨论】:

这仅适用于 CyanogenMod ROM,因为它需要使用 CyanogenMod 证书签署 APK。 我尝试在我的根手机上安装零短信应用程序,但签名和普通 apk 的安装均失败。这个零短信是否仅适用于 CyanogenMod ?我需要这个 kitkat 版本【参考方案2】:

在 Android 2.2 之前可以发送 Flash SMS(这是 0 类 SMS 的术语)。 Google 移除了 sendRawPdu API,所以即使你使用反射,你也无法做到。

这是我之前的做法(在 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);


【讨论】:

好的,我会选择这个作为ans,因为它在Android 2.2之后将无法使用 它是否支持最新的 Android 版本【参考方案3】:

Scrool 的答案确实是正确的,https://***.com/a/12873325/3082310,因为 ZeroSMS 确实发送了 flash SMS; 但是,它是一个概念验证,仅支持 7 位编码的 SMS。

为了正确编码,似乎需要修改代码并添加 if-then 或 switch-case 语句: 对于 7 位编码,如英文

使用(byte)0xF0

对于 16 位编码,UCS-2 编码

使用(byte) 0x18

否则,如果您输入不受支持的语言,则会出现垃圾字符。

【讨论】:

【参考方案4】:

是和不是。 很容易可能吗?不。tomfoolery(阅读:反射)在技术上是否可行? Usually。

【讨论】:

以上是关于Android 上的 0 类 SMS(闪存 SMS)的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 4.4.2 上更改 SMS 应用默认值

在 4.4.4 上从 android 中删除 SMS(删除后受影响的行 = 0(零))

在 4.4.4 上从 android 中删除 SMS(删除后受影响的行 = 0(零))

特定号码的SMS消息未显示在其他Android设备上

Android SMS Verification API 结果码始终为 0

Android SMS & GPS App - 安全权限