Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中以编程方式与USSD对话框交互_Android_Android Alertdialog_Ussd_Sim Card_Accessibilityservice - Fatal编程技术网

如何在android中以编程方式与USSD对话框交互

如何在android中以编程方式与USSD对话框交互,android,android-alertdialog,ussd,sim-card,accessibilityservice,Android,Android Alertdialog,Ussd,Sim Card,Accessibilityservice,我想使用USSD对话框,它是在拨打任何USSD代码后出现的比如说*123#,它要求用户输入选项号,以根据sim卡供应商执行特定任务。我需要与该对话框交互,以编程方式在文本框中提供输入 但是,我可以使用AccessibilityService在拨打任何USSD代码后读取警报对话框中的USSD响应,并在Toast中显示响应,如下代码所示。我还没有找到任何与USSD对话交互的解决方案 public class UssdService extends 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);
    }
}
以下是清单中的服务声明:

<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>

为了与USSD对话框交互,我使用了下面的代码

我在点击事件中使用了以下代码:

List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText("Send");
for (AccessibilityNodeInfo node : list) {
     node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
我的公司已经开发了一个Android SDK,它使用易访问性服务来运行多步骤USSD会话,并让它看起来发生在你的应用程序中。底层方法与公认答案中概述的方法类似,但有更多的抽象层,支持许多行为不同的设备,并且对用户隐藏会话

您为USSD服务创建配置,触发会话从应用程序运行,并传入所需的任何运行时变量。返回响应后,会通知您的应用程序,您可以根据需要对其进行解析。它在安卓4.3及以上版本上运行

SDK可以自由集成和使用,直到达到大规模。请看我们的网站开始


(披露:我是Hover的首席技术官)

如果您想设置点击事件,请使用下面的代码列表List=nodeInfo.findAccessibilityNodeInfosByText(“发送”);对于(AccessibilityNodeInfo节点:列表){node.performation(AccessibilityNodeInfo.ACTION_CLICK);isDialogClose=true;}如何获取nodeInfo?我希望您能给出更长的解释。我不知道如何使用你的代码,尽管它为我指明了正确的方向。
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();