Acerca del puerto SMS de Android
Quiero implementar una aplicación que recibe SMS en un puerto específico.
Código Manifiesto:
- Cola de SMS Manejo para el error SMS
- URL de SMS en Android
- Envío de SMS a un dispositivo de prueba real (no emulador) vía DDMS o instancia de emulador
- Adb emu comando no funciona a veces
- Límite de Android SMS?
<receiver android:name=".BinarySMSReceiver"> <intent-filter> <action android:name="android.intent.action.DATA_SMS_RECEIVED"/> <data android:port="8091"/> <data android:scheme="sms"/> </intent-filter> </receiver>
Y el código de la clase del receptor abajo.
public class BinarySMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); SmsMessage[] msgs = null; if(null != bundle) { String info = "Binary SMS from "; Object[] pdus = (Object[]) bundle.get("pdus"); msgs = new SmsMessage[pdus.length]; byte[] data = null; for (int i=0; i<msgs.length; i++){ msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); info += msgs[i].getOriginatingAddress(); info += "\n*****BINARY MESSAGE*****\n"; data = msgs[i].getUserData(); for(int index=0; index<data.length; ++index) { info += Character.toString((char)data[index]); } } Toast.makeText(context, info, Toast.LENGTH_SHORT).show(); } } }
Estoy recibiendo todos los SMS que están en este puerto ( 8091
) o no. Quiero recibir sólo los mensajes que son específicos de puerto.
- Enviar SMS por intención
- ¿Es possilbe leer y / o modificar la cabecera de SMS en Android?
- Interceptar mensaje SMS entrante y modificarlo
- ¿Cómo enviar SMS usando Twilio en mi aplicación Android?
- Twilio vs google voz api para SMS
- SMS enviado a través de SmsManager no automáticamente en la carpeta SENT?
- Envío de SMS mediante programación a varias personas obteniendo un error genérico
- Interceptar mensajes entrantes de flash en Android Mobile
Para aquellos que todavía se preguntan por qué la aplicación está recibiendo datos SMS dirigidos a otros puertos y no sólo al puerto 8091. El problema radica en el código Manifest. He visto muchas soluciones que se publicaron y la mayoría de ellos son realmente mal.
El Manifiesto debe ser:
<receiver android:name = ".SmsReceiver"> <intent-filter> <action android:name="android.intent.action.DATA_SMS_RECEIVED" /> <data android:scheme="sms" android:host="*" android:port="8095" /> </intent-filter> </receiver>
Los atributos esquema, host y puerto deben definirse en un solo elemento "data" del filtro de intenciones, no en elementos separados de "datos".
También no es que desde este enlace , en la sección "prueba de datos" se indica que
"El host y el puerto juntos constituyen la autoridad URI, si no se especifica un host, el puerto se ignora".
Por lo tanto, tenga en cuenta que debe especificar el host si desea que la aplicación reciba los datos de SMS para sólo un puerto específico.
El elemento "host" es * (asterisco) es especificar que acepta datos SMS de todos los hosts / números de teléfono
Espero que esto ayude a alguien (:
Tuve el problema similar, apenas agrego la condición siguiente de la comprobación en el comienzo de su 'onReceive' código:
String dataStr = intent.getDataString(); if (dataStr.indexOf(":8888" ) == -1) { return; }
- El teclado en dispositivo físico Android no siempre se oculta mientras se utiliza Appium
- Android Refreshing Fragment View después de AsyncTask