如何在安卓系统中以编程方式与USSD对话框进行交互

6
我想使用拨打任何USSD代码(例如*123#)后出现的USSD对话框,该对话框会要求用户输入选项号以执行特定任务(取决于SIM卡供应商)。我需要通过编程与该对话框进行交互,以在其中提供输入文本框。
然而,我能够使用AccessibilityService读取拨打任何USSD代码后出现的警报对话框中的USSD响应,并像以下代码所示在Toast中显示响应。我尚未找到与USSD对话框交互的解决方案。
public class UssdService extends AccessibilityService{
    public static String TAG = "USSD";

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        Log.d(TAG, "onAccessibilityEvent");
        String text = event.getText().toString();
        if (event.getClassName().equals("android.app.AlertDialog")) {
            Log.d(TAG, text);
            Toast.makeText(this, text, Toast.LENGTH_LONG).show();
        }
    }

    @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;
        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
        setServiceInfo(info);
    }
}

这里是 Manifest 中的服务声明:

<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/config_service" />
</service>

如果您想设置点击事件,则使用以下代码:List <AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(“发送”); for(AccessibilityNodeInfo node:list){ node.performAction(AccessibilityNodeInfo.ACTION_CLICK); isDialogClose = true; } - Varshil shah
2个回答

6

为了与USSD对话互动,我使用了以下代码。

我使用以下代码处理点击事件:

List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText("Send");
for (AccessibilityNodeInfo node : list) {
     node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}

我在EditText中使用以下代码来进行setText。这是当前聚焦的位置的setText

AccessibilityNodeInfo nodeInput = nodeInfo.findFocus(AccessibilityNodeInfo.FOCUS_INPUT);
Bundle bundle = new Bundle();        
bundle.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,pMPIN);
nodeInput.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT,bundle);
nodeInput.refresh();

1
我该如何获取nodeInfo? - Jimmy Ilenloa
我希望你能给一个更长的解释。虽然你的代码指引了我正确的方向,但我不知道如何使用它。 - Axes Grinds

2
我的公司Hover开发了一个Android SDK,它使用辅助服务来运行多步骤的USSD会话,并使其在您的应用程序中显示。底层方法类似于所述的已接受答案,但有更多的抽象层,支持许多表现不同的设备,并将会话隐藏在用户之外。
您可以为USSD服务创建配置,从您的应用程序触发会话并传递任何您需要的运行时变量。当响应返回时,您的应用程序会收到通知,您可以根据需要解析它。它适用于Android 4.3及以上版本。
该SDK可免费集成和使用,直到您达到大规模。请参阅我们的文档以开始使用。
(声明:我是Hover的CTO)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接