- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
几天来,我一直在这里和其他论坛上阅读有关 USSD 对话的主题。 (USSD 是指运营商的通知,其中包含通话费用详情)。
我见过很多解决方案,这些解决方案显然适用于 android 中较低的 API 级别,但经过大量测试后,我发现它们不再起作用,或者至少我无法让它们起作用。
首先我想知道是否有任何方法可以检测是否向用户显示了 ussd 对话框。所以我尝试了这个: Prevent USSD dialog and read USSD response?
但是我可以从日志中获得的所有信息都与我的应用程序相关,尽管我可以在 Eclipse 的 LogCat 中看到它们,但我的应用程序中没有捕获与 MMI 相关的日志!也许它在比我的 (4.2.2) 更低的 Android 版本上工作。
然后我决定使用“IExtendedNetworkService”,就像在以下链接和许多其他链接中使用的那样:
https://github.com/alaasalman/ussdinterceptor
Using IExtendedNetworkService to get USSD response in Android
How to read USSD messages in android?
但对于 android 4.2.2 及更高版本也无用。
然后我找到了这个链接: How to dismiss system dialog in Android?
它看起来很有希望,但即使经过大量测试,我也无法让它工作。我想也许我做错了什么,或者也是针对较低的 API。
在那之后,我尝试了许多其他方法,例如模拟主页键和返回键,甚至以编程方式触摸以隐藏该通知,但它们都不起作用,因为它们都在我自己的 Activity 下工作。
有谁知道这些方法或其他方法是否适用于在 android 4.2.2 及更高版本中管理甚至检测 USSD 消息?
非常感谢任何帮助,提前致谢。
最佳答案
可以使用无障碍服务。首先创建一个服务类:
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);
}
}
在 Android list 中声明它
<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" />
创建一个描述无障碍服务的 xml 文件,名为 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" />
就是这样。安装应用后,您必须在辅助功能设置中启用该服务(设置->辅助功能设置-> YourAppName)。
解决方案描述here和 here (russian) .
关于android - 一种在android中管理USSD对话框的新方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24875914/
我正在寻找一种通过拨号字符串本身与 USSD 菜单进行交互的方法。 例如拨号字符串激活运营商的 USSD 菜单并自动进入菜单选项并将其提交给 USSD 应用程序。 这可能吗? 最佳答案 也许有点晚了,
我可以捕获传入的 ussd 消息,但是如果是双卡手机,如何比较传入的 ussd 消息?如果我收到 ussd 消息警报,我如何知道传入的 ussd 消息是针对哪个 sim 卡的? 最佳答案 从 Wiki
我在互联网上浏览了很长时间,但未能找到有关在我的 PC 上设置用于开发和测试 USSD 服务的环境的信息。 我需要一个基于 Web 的应用程序,该应用程序使用 RESP API 发送请求,并将其发送到
是否可以将 USSD 代码发送到独立的 USSD 服务器(非移动运营商服务器)从 Android 设备? 具体场景是: A调用B B有一个可以识别来电的应用程序 B 将(通过应用程序)USSD 代码发
我对 ussd 进行了很多研究,但我无法阅读 USSD 响应,以及如何防止类似此应用程序的 ussd 对话。 https://play.google.com/store/apps/details?id
我知道一条 USSD 消息由 160 个字节组成。对于 7 位数据编码方案,最大字符数为 160*8/7,即 182 个字符。我不清楚 UCS2 编码的最大字符数是多少。通常,它会类似于 160/2,
我正在使用 Minicom (用于 Linux 的串行端口软件)用于与我的 GSM 调制解调器进行交互。实际上,现在我正在尝试通过 AT 命令使用我的移动提供商的一项服务。 我在这里说,我想看看我的余
我对此 channel 中的 USSD 和安全性有疑问。 正如您所知,如今移动银行和许多支付都使用 USSD,我想知道 USSD 安全吗? 如果 USSD 交易使用 a5/1 进行加密,那么几年前它就
我对自动化和 API 测试非常陌生。我当前的项目是基于 USSD 的银行业项目。我目前正在通过在浏览器模拟器上提供输入并读取控制台输出(ssh 到服务器)来手动测试。 API 的基本功能是生成包含所有
需要有关 USSD 网关的帮助。 我必须开发一个应用程序,它将直接连接到电信公司的 USSD 网关,并在特定分配的短代码号码上收听消息,例如444. 实际上,当客户从他的手机发出 *444# USSD
如何测试字符串是否为有效的 ussd 代码?我试图编写自己的正则表达式但失败了。 它应该以 * 符号开头,后跟任何整数或另一个 *。星号不能重复。它不能有**。最后一个符号必须是#。此符号也允许使用一
我试图使用下面的编程方式发送 USSD String smallTalkCode = "*"+ "808"+ "*"+ "13"+ Uri.encode("#"); startActivity(new
我的项目中目前正在开发的应用程序涉及 USSD 简码并通过简码与服务器交互。 此应用程序针对低端 java 手机,因此智能手机的使用目前不在范围内。 有什么方法可以使 USSD 应用程序自动化吗?
我应该为运营商开发一个 USSD 网关,所以请帮我解决以下问题-我可以为此目的使用 Asterisk 吗?- Asterisk 系统能否将字母数字字符作为用户输入。 最佳答案 USSD 通过 SS7
为了从我的应用程序中获得 USSD 的回复,我做了很多研发工作。但在那之后我可以请求 fot USSD 但不能得到对我的应用程序的响应。 有什么解决办法去USSD回复 谢谢 最佳答案 简而言之,您需要
我正在尝试使用我的 iPhone 设置 USSD 服务。但我希望 uSSD 连接在后台处于事件状态(连接 USSD 时没有灰色弹出框)。 USSD 连接将传入,因为我不会启动它,目前它会自动被手机打开
我正在尝试开发一个应用程序,它会默默地忽略 USSD 响应。我使用了 http://commandus.com/blog/?p=58 中的代码有微小的变化。我在包 com.android.intern
我已经厌倦了搜索如何在 Google 上发送 USSD 命令。 我想从运营商那里检查可能的余额。 我见过的所有示例都使用这样的命令: "AT+CUSD=1,\"*140*1#\"\r\n"; 这似乎
我计划创建一个 Android 应用程序,它将自动向 USSD 菜单发送用户响应。单击一个按钮,应用程序将发送初始代码,然后是其余的菜单输入。 例如,初始数字为 *143#,后跟 1、1、1 和用户
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一名优秀的程序员,十分优秀!