2012-02-03 11 views
10

Như tôi biết rằng điện thoại Nokia và một số điện thoại khác (như iPhone) có thể gửi và nhận SMS lớp 0, có thể cho Android không? Android có API không?SMS lớp 0 (SMS flash) trên Android

SMS nhấp nháy là gì?

SMS Flash là SMS được hiển thị trên màn hình điện thoại ngay khi khách đến.

Trừ khi bạn chọn lưu tin nhắn flash, nó sẽ biến mất khi điều hướng đi và sẽ không được lưu trong hộp thư đến của bạn.

Nếu nhiều tin nhắn flash được gửi đến một điện thoại, chỉ tin nhắn mới nhất mới được hiển thị và tất cả tin nhắn trước đó sẽ bị ghi đè.

Lớp 0: Cho biết rằng thông báo này sẽ được hiển thị trên MS ngay lập tức và báo cáo gửi tin nhắn sẽ được gửi lại cho SC. Tin nhắn không cần phải lưu trong MS hoặc trên thẻ SIM (trừ khi được người dùng di động chọn làm như vậy).

+2

Xin chào, bạn có biết ý nghĩa của ba lớp khác không?Tôi đã tìm kiếm khoảng hai giờ, nhưng tôi không thể tìm thấy bất kỳ thứ gì. – harshit

Trả lời

8

Đối bắt nguồn từ Android có thể bỏ qua một API và gửi Class 0 SMS. Có một dự án trên Git Hub được gọi là ZeroSMS:

ZeroSMS là chứng minh khái niệm minh họa cách gửi SMS lớp 0 trên Android> = 2.3.

Lưu ý: thao tác này chỉ hoạt động trên phiên bản 2.2 -> 4.1.2, phương pháp sendRawPdu đã bị xóa, vì vậy bạn cần tìm cách mới để thực hiện việc này.

+0

Tốt. Chọn đây là câu trả lời – xDragonZ

+1

Chỉ hoạt động trên ROM CyanogenMod, vì nó yêu cầu ký APK với các chứng chỉ CyanogenMod. – chuacw

+0

Tôi đã cố gắng cài đặt ứng dụng Zero Sms trên điện thoại gốc của mình, nhưng quá trình cài đặt không thành công cho cả APK đã ký và bình thường. Liệu Zero Sms này chỉ hoạt động với CyanogenMod? Tôi cần điều này cho phiên bản kitkat – Viral

1

Có và không. Có phải là dễ dàng có thể không? Có kỹ thuật có thể với tomfoolery (đọc: phản ánh)? Usually.

6

Có thể gửi SMS Flash (đó là thuật ngữ cho SMS lớp 0) trước Android 2.2. Google đã xóa API sendRawPdu, vì vậy ngay cả khi bạn đã sử dụng phản chiếu, bạn cũng không thể thực hiện được.

Đây là cách tôi đã làm nó trước đây (điều này đã được thử nghiệm trên Android 1.6 và làm việc)

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

} 
+0

Ok, tôi sẽ chọn tùy chọn này là ans vì nó sẽ không hoạt động sau Android 2.2 – xDragonZ

2

Scrool Câu trả lời của thực sự là chính xác, https://stackoverflow.com/a/12873325/3082310, vì ZeroSMS không gửi SMS của flash; Tuy nhiên, là một Proof-of-Concept và chỉ hỗ trợ SMS với mã hóa 7 bit.

Đối với mã hóa thích hợp có vẻ như có một cần phải sửa đổi mã và thêm if-then hoặc chuyển sang hợp cụ thể báo cáo: Đối với 7-bit mã hóa, như trong tiếng Anh

sử dụng (byte)0xF0

Đối với 16 mã hóa bit, UCS-2 mã hóa

sử dụng (byte) 0x18

nếu không, nhân vật rác xuất hiện nếu bạn nhập ngôn ngữ được hỗ trợ.