2014-08-28 2 views
1

Я хочу добавить sms в память сим-карты, но не смог этого достичь. Я много googled, но не смог получить никакой помощи.Как добавить SMS в Sim Memory в Android?

Я пробовал использовать код для добавления смс на сим-карту, но это не работает.

Добавить SMS на сим-карте

ContentValues values = new ContentValues(); 
values.put(Telephony.Sms.ADDRESS, "+91xxxxxxxxxx"); 
values.put(Telephony.Sms.BODY, "SMS inserting test");   
getContentResolver().insert(Uri.parse("content://sms/inbox"), values); 

Любая помощь будет высоко оценен.

+0

Попробуйте это, если это поможет http://stackoverflow.com/a/4119960/1226882 – moDev

+0

Не помогаю, я пытаюсь добавить sms на SIM-карту –

ответ

2

Чтобы сохранить SMS-сообщение на SIM-карту (ICC-карту), вам необходимо создать PDU-строку SMS-сообщения.

Следующий код создает строку PDU сообщения. Вы должны вставить PhoneNumber и Message как String. Обратите внимание, что строка сообщения имеет максимальную длину 159 символов.

public String getPduString(String msg, String phoneNr){ 
    String inpString = msg; 
    String phoneNumber = phoneNr; 
    String REIVER_NUMBER_LENGTH = intToHex(phoneNr.length()); 

    if (phoneNumber.length() % 2 != 0){ 
     phoneNumber = phoneNumber + "F"; 
    } 

    String octetFirst = ""; 
    String octetSecond = ""; 
    String output = ""; 

    String firstOctet = "04"; 
    String REIVER_NUMBER_FORMAT = "91"; 

    String REIVER_NUMBER = semiOctetToString(phoneNumber); 
    String PROTO_ID = "00"; 
    String DATA_ENCODING = "00"; 
    String VALID_PERIOD = "20806291731408"; 
    String userDataSize = intToHex(inpString.length()); 

    for (int i = 0; i <= inpString.length(); i++){ 
     if (i == inpString.length()){ 
      if (octetSecond != ""){ 
       output = output + "" + (intToHex(binToInt(octetSecond))); 
      } 
      break; 
     } 
     String current = intToBin(getSevenBit(inpString.charAt(i)),7); 
     String currentOctet; 
     if ((i != 0)&&(i % 8 != 0)){ 
      octetFirst = current.substring(7 - (i) % 8); 
      currentOctet = octetFirst + octetSecond; 

      output = output + "" + (intToHex(binToInt(currentOctet))); 
      octetSecond = current.substring(0,7 - (i) % 8); 
     }else{ 
      octetSecond = current.substring(0,7 - (i) % 8); 
     } 
    } 

    String header = firstOctet + REIVER_NUMBER_LENGTH + REIVER_NUMBER_FORMAT + REIVER_NUMBER + PROTO_ID + DATA_ENCODING + VALID_PERIOD + userDataSize; 
    return header + output; 
} 

Функция нужны некоторые другие функции для работы:

public String intToHex(int i){ 
    String sHex = "ABCDEF"; 
    String h = ""; 

    for (int j = 0; j <= 3; j++){ 
     h = h + sHex.charAt((i >> (j * 8 + 4)) & 0x0F) + sHex.charAt((i >> (j * 8)) & 0x0F); 
    } 
    return h.substring(0,2); 
} 

public String semiOctetToString(String inp){ 
    String out = ""; 
    String temp = ""; 
    for (int i = 0; i < inp.length(); i = i + 2){ 
     temp = inp.substring(i, i + 2); 
     out = out + temp.charAt(1) + temp.charAt(0); 
    } 
    return out; 
} 

public String intToBin(int x, int size){ 
    int base = 2; 
    BigInteger num = new BigInteger(Integer.toString(x)); 
    String bin = num.toString(base); 
    for (int i = bin.length(); i < size; i++){ 
     bin = "0" + bin; 
    } 
    return bin; 
} 

public int getSevenBit(char character){ 
    char[] sevenbitdefault = {'@', '£', '$', '¥', 'è', 'é', 'ù', 'ì', 'ò', 'Ç', '\n', 'Ø', 'ø', '\r','Å', 'å','\u0394', '_', '\u03a6', '\u0393', '\u039b', '\u03a9', '\u03a0','\u03a8', '\u03a3', '\u0398', '\u039e','€', 'Æ', 'æ', 'ß', 'É', ' ', '!', '"', '#', '¤', '%', '&', '\'', '(', ')','*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7','8', '9', ':', ';', '<', '=', '>', '?', '¡', 'A', 'B', 'C', 'D', 'E','F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S','T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ä', 'Ö', 'Ñ', 'Ü', '§', '¿', 'a','b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o','p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'ä', 'ö', 'ñ','ü', 'à'}; 
    for (int i = 0; i < sevenbitdefault.length; i++){ 
     if (sevenbitdefault[i] == character){ 
      return i; 
     } 
    } 
    return 0; 
} 

public int binToInt(String x){ 
    int total = 0; 
    int power = x.length() - 1; 
    for (int i = 0; i < x.length(); i++){ 
     if (x.charAt(i) == '1'){ 
      total = (int) (total + Math.pow(2, power)); 
     } 
     power = power - 1; 
    } 
    return total; 
} 

Результат функции «getPduString» является PDU-строка, которую можно хранить на SIM-карте.

Вы можете использовать скрытый метод 'copyMessageToIcc' из 'android.telephony.SmsManager'. Проблема в том, что метод скрыт. Вам нужно использовать его с помощью java-отражения. Я написал новый SMStoIcc:

public boolean SMStoIcc(byte[] smsc,byte[] pdu,int status) { 
    boolean flag = false; 
    try { 
     Class<?> c = Class.forName("android.telephony.SmsManager"); 
     Method m = c.getMethod("copyMessageToIcc", byte[].class, byte[].class, int.class); 
     try { 
      flag = ((Boolean)m.invoke(SmsManager.getDefault(), smsc, pdu, status)).booleanValue(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } 
    } catch (NoSuchMethodException e) { 
     Log.e("NoSuchMethodException","NoSuchMethodException :"+ e.getMessage()); 
     e.printStackTrace(); 
    } catch (ClassNotFoundException ex) { 
     Log.e("ClassNotFoundException","ClassNotFoundException :"+ ex.getMessage()); 
     ex.printStackTrace(); 
    } 
    return flag; 
} 

Этот метод хранит PDU-строку на SIM-карте. Он возвращает true, если процесс был успешным. Первым параметром является smsc. Это не так важно, но вам это нужно. Второй параметр - это pdu. Третий параметр - это статус. Он должен быть 1 для «чтения».

Вы должны вставить значения в виде байта []. Я написал следующую функцию «hexStringToByteArray», чтобы преобразовать smsc и pdu в массив байтов.

public static byte[] hexStringToByteArray(String s) { 
    int len = s.length(); 
    byte[] data = new byte[len/2]; 
    for (int i = 0; i < len; i += 2) { 
     data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) 
          + Character.digit(s.charAt(i+1), 16)); 
    } 
    return data; 
} 

Строка smsc в моем проекте всегда «07910100000000F0».

Теперь вы можете добавить СМС на SIM-карту.

Используйте функции:

String smsc = "07910100000000F0"; 
String nr = "1234567890"; 
String msg = "SMS inserting test"; 
String pdu_string = getPduString(msg, nr); 

byte[] service_center = hexStringToByteArray(smsc); 
byte[] pdu = hexStringToByteArray(pdu_string); 
boolean success = SMStoIcc(service_center, pdu, 1); 
// if it was successful, success is true 

Это полный процесс, чтобы добавить SMS-сообщение на SIM-карту ...

для чтения SMS с использованием SIM:

public ArrayList<SmsMessage> getSmsList(){ 
    ArrayList<SmsMessage> list = new ArrayList<SmsMessage>(); 
    SmsManager newSmsManager = SmsManager.getDefault(); 
    try { 
     Class<?> smsManagerClass = Class.forName("android.telephony.SmsManager"); 
     Method localMethod = smsManagerClass.getMethod("getAllMessagesFromIcc",null); 
     try { 
      list = (ArrayList<SmsMessage>)localMethod.invoke(newSmsManager, null); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } 
    } catch (NoSuchMethodException e) { 
     Log.e("NoSuchMethodException","NoSuchMethodException :"+ e.getMessage()); 
     e.printStackTrace(); 
    } catch (ClassNotFoundException ex) { 
     Log.e("ClassNotFoundException","ClassNotFoundException :"+ ex.getMessage()); 
     ex.printStackTrace(); 
    } 

    return list; 
} 

Для удаления SMS-сообщения с SIM-карты:

public boolean delMessageFromIcc(int index){ 
    boolean flag = false; 
    try { 
     Class<?> smsManagerClass = Class.forName("android.telephony.SmsManager"); 
     Method method = smsManagerClass.getMethod("deleteMessageFromIcc", int.class); 
     try { 
      flag = ((Boolean)method.invoke(SmsManager.getDefault(), index)).booleanValue(); 
     } catch (IllegalAccessException e) { 
      Toast.makeText(getApplicationContext(), e.toString() + " _1", Toast.LENGTH_LONG).show(); 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      Toast.makeText(getApplicationContext(), e.toString() + " _2", Toast.LENGTH_LONG).show(); 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      Toast.makeText(getApplicationContext(), e.getCause().toString() + " _3", Toast.LENGTH_LONG).show(); 
      e.printStackTrace(); 
     } 
    } catch (NoSuchMethodException e) { 
     Toast.makeText(getApplicationContext(), e.toString() + " _4", Toast.LENGTH_LONG).show(); 
     Log.e("NoSuchMethodException","NoSuchMethodException :"+ e.getMessage()); 
     e.printStackTrace(); 
    } catch (ClassNotFoundException ex) { 
     Toast.makeText(getApplicationContext(), ex.toString() + " _5", Toast.LENGTH_LONG).show(); 
     Log.e("ClassNotFoundException","ClassNotFoundException :"+ ex.getMessage()); 
     ex.printStackTrace(); 
    } 

    return flag; 
} 

Для обновления сообщений об использовании SIM-карты:

public boolean updateMessageOnIcc(int index, int state, byte[] pdu){ 
    boolean flag = false; 
    try { 
     Class<?> smsManagerClass = Class.forName("android.telephony.SmsManager"); 
     Method localMethod = smsManagerClass.getMethod("updateMessageOnIcc", int.class, int.class, byte[].class); 
     try { 
      flag = ((Boolean)localMethod.invoke(SmsManager.getDefault(), index, state, pdu)).booleanValue(); 
     } catch (IllegalAccessException e) { 
      Toast.makeText(getApplicationContext(), e.toString() + " _1", Toast.LENGTH_LONG).show(); 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      Toast.makeText(getApplicationContext(), e.toString() + " _2", Toast.LENGTH_LONG).show(); 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      Toast.makeText(getApplicationContext(), e.getCause().toString() + " _3", Toast.LENGTH_LONG).show(); 
      e.printStackTrace(); 
     } 
    } catch (NoSuchMethodException e) { 
     Toast.makeText(getApplicationContext(), e.toString() + " _4", Toast.LENGTH_LONG).show(); 
     Log.e("NoSuchMethodException","NoSuchMethodException :"+ e.getMessage()); 
     e.printStackTrace(); 
    } catch (ClassNotFoundException ex) { 
     Toast.makeText(getApplicationContext(), ex.toString() + " _5", Toast.LENGTH_LONG).show(); 
     Log.e("ClassNotFoundException","ClassNotFoundException :"+ ex.getMessage()); 
     ex.printStackTrace(); 
    } 
    return flag; 
} 

Я надеюсь, что я мог бы вам помочь .....