android - secretos - codigos ussd
Una nueva forma de administrar los diálogos de USSD en Android (2)
Es posible usar el servicio de accesibilidad. Primero crea una clase de servicio:
public class USSDService extends AccessibilityService {
public static String TAG = USSDService.class.getSimpleName();
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
Log.d(TAG, "onAccessibilityEvent");
AccessibilityNodeInfo source = event.getSource();
/* if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && !event.getClassName().equals("android.app.AlertDialog")) { // android.app.AlertDialog is the standard but not for all phones */
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && !String.valueOf(event.getClassName()).contains("AlertDialog")) {
return;
}
if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED && (source == null || !source.getClassName().equals("android.widget.TextView"))) {
return;
}
if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED && TextUtils.isEmpty(source.getText())) {
return;
}
List<CharSequence> eventText;
if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
eventText = event.getText();
} else {
eventText = Collections.singletonList(source.getText());
}
String text = processUSSDText(eventText);
if( TextUtils.isEmpty(text) ) return;
// Close dialog
performGlobalAction(GLOBAL_ACTION_BACK); // This works on 4.1+ only
Log.d(TAG, text);
// Handle USSD response here
}
private String processUSSDText(List<CharSequence> eventText) {
for (CharSequence s : eventText) {
String text = String.valueOf(s);
// Return text if text is the expected ussd response
if( true ) {
return text;
}
}
return null;
}
@Override
public void onInterrupt() {
}
@Override
protected void onServiceConnected() {
super.onServiceConnected();
Log.d(TAG, "onServiceConnected");
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.flags = AccessibilityServiceInfo.DEFAULT;
info.packageNames = new String[]{"com.android.phone"};
info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED | AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
setServiceInfo(info);
}
}
Declararlo en el manifiesto de Android.
<service android:name=".USSDService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data android:name="android.accessibilityservice"
android:resource="@xml/ussd_service" />
Cree un archivo xml que describa el servicio de accesibilidad llamado ussd_service
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:description="@string/accessibility_service_description"
android:notificationTimeout="0"
android:packageNames="com.android.phone" />
Eso es. Una vez instalada la aplicación, debe habilitar el servicio en Configuración de accesibilidad (Configuración-> Configuración de accesibilidad -> Nombre de aplicación).
Solución descrita here y aquí (ruso) .
He estado leyendo hilos sobre diálogos de USSD aquí y en otros foros durante unos días. (Por USSD me refiero a las notificaciones del operador con los detalles del costo de la llamada).
He visto muchas soluciones que aparentemente funcionaron para niveles de API más bajos en Android, pero después de muchas pruebas, pensé que ya no funcionan o al menos no podía hacer que funcionen.
Primero quise saber si hay alguna manera de detectar si se ha mostrado un diálogo de ussd al usuario. así que intenté esto: ¿ Impedir el diálogo de USSD y leer la respuesta de USSD?
pero todo lo que pude obtener de los registros se relacionó de alguna manera con mi aplicación, aunque pude verlos en el LogCat de Eclipse, ¡pero no se registraron registros relacionados con MMI en mi aplicación! tal vez estaba funcionando en versiones de Android más bajas que las mías (4.2.2).
entonces decidí usar "IExtendedNetworkService" como se usó en los siguientes enlaces y muchos otros:
https://github.com/alaasalman/ussdinterceptor
Uso de IExtendedNetworkService para obtener la respuesta de USSD en Android
¿Cómo leer los mensajes de USSD en android?
Implementando las características de USSD. Enlazar un servicio a PhoneUtils sin reiniciar el teléfono en cada actualización
pero también fue inútil para Android 4.2.2 y superior.
Entonces encontré este enlace: ¿Cómo descartar el diálogo del sistema en Android?
Parecía prometedor, pero no pude hacerlo funcionar incluso después de muchas pruebas. Pensé que tal vez estaba haciendo algo mal o que era también para API más bajas.
después de eso probé muchas otras cosas, como simular la tecla de inicio y la tecla de retroceso e incluso tocar programáticamente para ocultar esa notificación, pero ninguna funcionó, ya que todas funcionan bajo mi propia actividad.
¿Alguien sabe si alguno de estos métodos u otros funcionan para administrar o incluso detectar mensajes USSD en Android 4.2.2 y superior?
Realmente agradezco cualquier ayuda, gracias de antemano.
Lamentablemente de ninguna manera.
Hemos estado buscando ese comando también es una solución a este problema, pero si resultó obtener información solo a través del análisis de registros en el teléfono que no garantiza el 100% del trabajo en todos los dispositivos.
Como resultado, pudimos llegar a un acuerdo con operadores móviles en nuestro país (solo tenemos 3 operadores móviles) y nos proporcionaron la API para obtener el saldo del número de teléfono, pero este método solo funciona localmente.