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?
- Bloquear SMS salientes por contentObserver
- Android: cómo obtener el número de teléfono de un SMS entrante?
- ¿Cómo puedo enviar un SMS desde un BroadcastReceiver y comprobar su estado?
- Buzón de entrada de SMS de consulta de Android por nombre de remitente
- Observe los SMS que envían la aplicación en el emulador
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).
- Envío de SMS mediante programación a varias personas obteniendo un error genérico
- Tarjeta dual sim enviar sms android
- ¿Cómo leer el contenido del mensaje de un mensaje nuevo en el próximo mensaje en android?
- ContentObserver en el contenido: // sms / in 1.6+?
- ¿Cómo acceder al almacenamiento de SMS en Android?
- Cómo desactivar mi aplicación sms como aplicación predeterminada en Android
- Cola de SMS Manejo para el error SMS
- ¿Cómo obtener el informe de entrega para el mensaje de texto enviado?
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 .
- Cómo tratar un objeto JSON grande en Android
- Cómo cambiar el color RatingBar dependiendo del número de estrellas?