Clase 0 SMS (SMS flash) en Android

Como sé que Nokia y algunos otros teléfono (como iPhone) son capaces de enviar y recibir SMS clase 0, ¿es posible para Android? ¿Tiene Android la API?

¿Qué es el SMS flash?

Flash SMS es un SMS que se muestra en la pantalla del teléfono inmediatamente a la llegada.

A menos que elija guardar el mensaje flash, desaparecerá al navegar y no se guardará en su bandeja de entrada.

Si se envían varios mensajes de flash a un teléfono, sólo se mostrará el último mensaje y se sobrescribirán todos los anteriores.

Clase 0 : Indica que este mensaje debe ser mostrado en la MS inmediatamente y un reporte de entrega de mensajes debe ser enviado de vuelta al SC. El mensaje no tiene que ser guardado en el MS o en la tarjeta SIM (a menos que el usuario móvil lo haya seleccionado).

Para el Android con raíces es posible pasar por alto un API y enviar SMS de clase 0. Hay un proyecto en Git Hub llamado ZeroSMS :

ZeroSMS es una prueba de concepto que demuestra una forma de enviar SMS Clase 0 en android> = 2.3.

Nota: esto sólo funciona en las versiones 2.2 -> 4.1.2, el método sendRawPdu fue eliminado, por lo que tendrá que encontrar una nueva forma de hacerlo.

Era posible enviar SMS Flash (es el término para la clase 0 SMS) antes de Android 2.2. Google eliminó la API sendRawPdu, por lo que incluso si utilizó la reflexión, no sería capaz de hacerlo.

Aquí es cómo lo hice anteriormente (esto fue probado en Android 1.6 y funcionó)

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

La respuesta de Scrool es correcta, https://stackoverflow.com/a/12873325/3082310 , ya que ZeroSMS envía SMS flash; Sin embargo, es una prueba de concepto y sólo admite SMS con codificación de 7 bits.

Para la codificación adecuada parece que hay una necesidad de modificar el código y añadir if-then o switch-case declaraciones: Para la codificación de 7 bits, como en Inglés

Uso (byte)0xF0

Para la codificación de 16 bits, la codificación UCS-2

Uso (byte) 0x18

De lo contrario, aparecerán caracteres no deseados si introduce un idioma no compatible.

Si y no. ¿Es fácilmente posible? No. ¿Es técnicamente posible con tomfoolery (leer: reflexión)? Generalmente .

  • Uso de SMS para verificar el número de teléfono de un dispositivo
  • Recepción de SMS en Android Manifest.xml
  • ¿Cómo leer el mensaje entrante usando el servicio en segundo plano en android?
  • ¿Por qué obtengo NullPointerException al enviar un SMS en un HTC Desire, o lo que es SubmitPdu?
  • ¿Es possilbe leer y / o modificar la cabecera de SMS en Android?
  • Marcación de mensajes SMS como mensajes de lectura / no leídos o eliminación de mensajes que no funcionan en KitKat
  • ¿Cómo pasar datos a BroadcastReceiver?
  • Eliminar SMS en Android 1.5
  • KitKat para Android (API 19) - ¿Cómo escribir mensajes en SMS Content Provider, sin enviarlos, desde la aplicación no predeterminada?
  • Recuperación de los mensajes SMS desde la tarjeta SIM con android
  • BroadcastReceiver no funciona después de BOOT_COMPLETED
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.