Une nouvelle façon de gérer USSD dialogs dans android
j'ai lu des articles sur les dialogues de USSD ici et dans d'autres forums depuis quelques jours. (par USSD je veux dire les notifications de l'opérateur avec les détails du coût de l'appel dans elle).
j'ai vu beaucoup de solutions qui apparemment ont fonctionné pour des niveaux D'API inférieurs dans android, mais après beaucoup de tests, je me suis dit qu'ils ne fonctionnent plus ou au moins je ne pouvais pas les faire fonctionner.
tout d'abord, je voulais savoir s'il y avait un moyen de détecter si un dialogue ussd a été montré à la utilisateur. j'ai donc essayé cette : empêche USSD dialog et lire USSD response?
mais tout ce que j'ai pu obtenir à partir des logs étaient en quelque sorte liés à mon application, même si je pouvais les voir dans le LogCat D'Eclipse, mais aucun logs lié à MMI n'a été capturé dans mon application ! peut-être qu'il fonctionnait en version Android inférieure à la mienne (4.2.2).
puis j'ai décidé d'utiliser "IExtendedNetworkService" comme il a été utilisé dans les liens suivants et beaucoup d'autres:
https://github.com/alaasalman/ussdinterceptor
utiliser IExtendedNetworkService pour obtenir USSD réponse dans Android
Comment lire les messages USSD sur android?
la mise en Œuvre de USSD fonctionnalités. Liant un service aux PhoneUtils sans redémarrer le téléphone sur chaque mise à jour
mais c'était aussi inutile pour android 4.2.2 et au-dessus.
puis j'ai trouvé ce lien : comment rejeter dialogue système dans Android?
cela semblait prometteur mais je n'ai pas pu le faire fonctionner même après beaucoup de tests. J'ai pensé que peut-être je faisais quelque chose de mal ou c'était pour les APIs inférieurs aussi.
après cela j'ai essayé beaucoup d'autres choses comme Simuler la clé de la maison et la clé arrière et même toucher programmatically pour cacher cette notification mais aucun d'entre eux travaillaient depuis ils travaillent tous sous ma propre activité.
est-ce que quelqu'un sait si l'une de ces méthodes ou d'autres fonctionnent pour gérer ou même détecter des messages USSD dans android 4.2.2 et au-dessus ?
j'apprécie vraiment toute aide, merci à l'avance.
2 réponses
il est possible d'utiliser le service d'accessibilité. Tout d'abord créer une classe de service:
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);
}
}
déclarez-le dans le manifeste 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" />
créer un fichier xml qui décrit le service d'accessibilité appelé 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" />
C'est ça. Une fois l'application installée, vous devez activer le service dans les paramètres D'accessibilité (paramètre->Paramètre D'accessibilité -> YourAppName).
Solution décrite ici et ici (russe) .
malheureusement pas moyen.
nous avons été à la recherche de cette commande est également une solution à ce problème, mais s'il s'est avéré pour obtenir des informations uniquement par l'analyse des logs dans le téléphone qui ne garantit pas 100% du travail sur tous les appareils.
en conséquence, nous avons été en mesure de conclure un accord avec les opérateurs mobiles dans notre pays (nous n'avons que 3 opérateurs mobiles), et ils nous ont fourni L'API pour obtenir le solde du téléphone nombre, mais cette méthode ne fonctionne que localement.