Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


El servicio USSD no funciona

Estoy tratando de desarrollar una aplicación que silenciosamente desestime las respuestas USSD. He utilizado el código de http://commandus.com/blog/?p=58 con cambios menores. He creado IExtendedNetworkService.aidl en el paquete com.android.internal.telephony y USSDDumbExtendedNetworkService dentro del paquete com.commandus.ussd . El problema es que no sucede nada después de ejecutar la aplicación (incluso después de reiniciar el teléfono). ¿Puede alguien señalar qué estoy haciendo mal? ¿Debo escribir algún código adicional para que funcione?

IExtendedNetworkService.aidl

 package com.android.internal.telephony; /** * Interface used to interact with extended MMI/USSD network service. */ interface IExtendedNetworkService { /** * Set a MMI/USSD command to ExtendedNetworkService for further process. * This should be called when a MMI command is placed from panel. * @param number the dialed MMI/USSD number. */ void setMmiString(String number); /** * return the specific string which is used to prompt MMI/USSD is running */ CharSequence getMmiRunningText(); /** * Get specific message which should be displayed on pop-up dialog. * @param text original MMI/USSD message response from framework * @return specific user message correspond to text. null stands for no pop-up dialog need to show. */ CharSequence getUserMessage(CharSequence text); /** * Clear timeout message and pre-set MMI/USSD command * This should be called when user cancel a pre-dialed MMI command. */ void clearMmiString(); } 

USSDDumbExtendedNetworkService

  package com.commandus.ussd; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.os.IBinder; import android.os.PatternMatcher; import android.os.RemoteException; import android.util.Log; import com.android.internal.telephony.IExtendedNetworkService; /** * Service implements IExtendedNetworkService interface. * USSDDumbExtendedNetworkService Service must have name * "com.android.ussd.IExtendedNetworkService" of the intent declared in the * Android manifest file so com.android.phone.PhoneUtils class bind to this * service after system rebooted. Please note service is loaded after system * reboot! Your application must check is system rebooted. * * @see Util#syslogHasLine(String, String, String, boolean) */ public class USSDDumbExtendedNetworkService extends Service { public static final String TAG = "MobileServices"; public static final String LOG_STAMP = "*USSDTestExtendedNetworkService bind successfully*"; public static final String URI_SCHEME = "ussd"; public static final String URI_AUTHORITY = "g_el.net"; public static final String URI_PATH = "/"; public static final String URI_PAR = "return"; public static final String URI_PARON = "on"; public static final String URI_PAROFF = "off"; public static final String MAGIC_ON = ":ON;)"; public static final String MAGIC_OFF = ":OFF;("; public static final String MAGIC_RETVAL = ":RETVAL;("; private static boolean mActive = false; private static CharSequence mRetVal = null; private Context mContext = null; private String msgUssdRunning = "G Testing..."; final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_INSERT.equals(intent.getAction())) { mContext = context; if (mContext != null) { msgUssdRunning = "ussd blocker Running"; mActive = true; Log.d(TAG, "activate"); } } else if (Intent.ACTION_DELETE.equals(intent.getAction())) { mContext = null; mActive = false; Log.d(TAG, "deactivate"); } } }; private final IExtendedNetworkService.Stub mBinder = new IExtendedNetworkService.Stub() { @Override public void setMmiString(String number) throws RemoteException { Log.d(TAG, "setMmiString: " + number); } @Override public CharSequence getMmiRunningText() throws RemoteException { Log.d(TAG, "getMmiRunningText: " + msgUssdRunning); return msgUssdRunning; } @Override public CharSequence getUserMessage(CharSequence text) throws RemoteException { if (MAGIC_ON.contentEquals(text)) { mActive = true; Log.d(TAG, "control: ON"); return text; } else { if (MAGIC_OFF.contentEquals(text)) { mActive = false; Log.d(TAG, "control: OFF"); return text; } else { if (MAGIC_RETVAL.contentEquals(text)) { mActive = false; Log.d(TAG, "control: return"); return mRetVal; } } } if (!mActive) { Log.d(TAG, "getUserMessage deactivated: " + text); //return null;//Use this in order to cancel the output on the screen. return text; } String s = text.toString(); // store s to the ! Uri uri = new Uri.Builder().scheme(URI_SCHEME).authority(URI_AUTHORITY).path(URI_PATH).appendQueryParameter(URI_PAR,text.toString()).build(); sendBroadcast(new Intent(Intent.ACTION_GET_CONTENT, uri)); mActive = false; mRetVal = text; Log.d(TAG, "getUserMessage: " + text + "=" + s); return null; } @Override public void clearMmiString() throws RemoteException { Log.d(TAG, "clearMmiString"); } }; /** * Put stamp to the system log when PhoneUtils bind to the service after * Android has rebooted. Application must call * {@link Util#syslogHasLine(String, String, String, boolean)} to check is * phone rebooted or no. Without reboot phone application does not bind tom * this service! */ @Override public IBinder onBind(Intent intent) { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_INSERT); filter.addAction(Intent.ACTION_DELETE); filter.addDataScheme(URI_SCHEME); filter.addDataAuthority(URI_AUTHORITY, null); filter.addDataPath(URI_PATH, PatternMatcher.PATTERN_LITERAL); registerReceiver(mReceiver, filter); // Do not localize! Log.i(TAG, LOG_STAMP); return mBinder; } public IBinder asBinder() { Log.d(TAG, "asBinder"); return mBinder; } @Override public boolean onUnbind(Intent intent) { unregisterReceiver(mReceiver); return super.onUnbind(intent); } } 

Archivo de manifiesto

 <service android:name="com.commandus.ussd.USSDDumbExtendedNetworkService"> <intent-filter > <action android:name="com.android.ussd.IExtendedNetworkService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> 

  • ¿Cómo leer los mensajes de USSD en android?
  • Utilizar IExtendedNetworkService para obtener respuesta de USSD en Android
  • ¿Cómo interactuar con el menú USSD?
  • ¿Es posible leer el historial de costos de llamadas desde el diálogo planteado después de finalizar la llamada de prepago?
  • Una nueva forma de administrar los diálogos USSD en android
  • Implementación de funciones USSD. Vincular un servicio a PhoneUtils sin reiniciar el teléfono en cada actualización
  • ¿Cómo enviar un código USSD que contiene punto flotante decimal (.)?
  • ¿Prevenir el diálogo de USSD y leer la respuesta de USSD?
  • 4 Solutions collect form web for “El servicio USSD no funciona”

    ¿Ha declarado su receptor de difusión en su archivo de manifiesto?

    Agregue dentro de su manifiesto:

     <receiver android:name="com.xxx.receivers.BootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <service android:name="your.package.ExtendedNetworkService" /> 

    En BootReceiver.java:

      public void onReceive(Context context, Intent intent) { context.startService(new Intent(context,ExtendedNetworkService.class)); } 

    En ExtendedNetworkService.java:

     public class ExtendedNetworkService extends Service { IExtendedNetworkService.Stub binder = new IExtendedNetworkService.Stub() { public void setMmiString(String number) throws RemoteException {} public CharSequence getMmiRunningText() throws RemoteException { return null; } public CharSequence getUserMessage(CharSequence text) throws RemoteException { Log.d(Constants.TAG, "Message : " + text); Log.d(Constants.TAG, "getMmiRunningTest() : " + getMmiRunningText()); return null; } public void clearMmiString() throws RemoteException { } }; return false; } public void onCreate() { Log.d(Constants.TAG, "ExtendedNetworkService Started.."); super.onCreate(); } public IBinder onBind(Intent arg0) { Log.d(Constants.TAG, "ExtendedNetworkService got binded..."); return binder; } } 

    Ejemplo de código de trabajo completo https://github.com/alaasalman/ussdinterceptor

    ¡Disfrutar!

    Tenga en cuenta que esta interfaz IExtendedNetworkService se eliminó a partir de Android 4.2.2 No hay alternativa proporcionada por Google todavía, y no hay planes para proporcionar dicha alternativa. Para obtener una referencia, puede consultar http://code.google.com/p/android/issues/ Detalle? Id = 57120 .

    Si su uso de Android 3.1 (API 12), cuando una aplicación se instala está en un estado detenido por defecto hasta que el usuario inicia su aplicación explícitamente como se indica en el commonsblog:

    http://commonsware.com/blog/2011/07/13/boot-completed-regression-confirmed.html

    Y en la documentación de Android:

    http://developer.android.com/about/versions/android-3.1.html#launchcontrols

    Creo que la conclusión es que una aplicación que contiene sólo un IntentService o BroadcastReceiver no puede ser iniciado por su propia cuenta.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.