如何在android

时间:2016-03-07 09:28:03

标签: android android-alertdialog ussd sim-card accessibilityservice

我想使用 USSD对话,拨打任何 USSD代码 * 123#,要求用户输入要执行的选项号具体任务取决于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>

2 个答案:

答案 0 :(得分:3)

为了与USSD对话框进行交互,我使用了以下代码。

我使用以下代码进行点击事件:

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

我在setText中使用了EditText的以下代码。这是当前焦点所在的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 :(得分:1)

我的公司Hover开发了一个Android SDK,该SDK使用可访问性服务来运行多步USSD会话,并使其似乎在您的应用程序中发生。底层方法类似于已接受的答案中概述的方法,但是存在更多的抽象层,支持许多行为不同的设备,并且向用户隐藏了会话。

您可以为USSD服务创建配置,触发会话以从您的应用程序运行并传递所需的任何运行时变量。返回响应后,您的应用将收到通知,您可以根据需要对其进行解析。它适用于Android 4.3及更高版本。

SDK是免费集成和使用的,直到您大规模使用为止。请参阅我们的docs开始使用。

(披露:我是Hover的CTO)