Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.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
Java 屏幕关闭android时AccessibilityService不工作_Java_Android - Fatal编程技术网

Java 屏幕关闭android时AccessibilityService不工作

Java 屏幕关闭android时AccessibilityService不工作,java,android,Java,Android,我在这里开发了一个android应用程序,它有一个从ussd拨号读取窗口文本的可访问性服务。 我很成功,因为我做得很好。但当屏幕灯关闭并锁定时,可访问性服务无法工作。 我在这里提供访问能力服务的编码 请查看并给我建议如何解决屏幕开/关的问题 public class USSDService extends AccessibilityService { public static String TAG = USSDService.class.getSimpleName(); @Override

我在这里开发了一个android应用程序,它有一个从ussd拨号读取窗口文本的可访问性服务。 我很成功,因为我做得很好。但当屏幕灯关闭并锁定时,可访问性服务无法工作。 我在这里提供访问能力服务的编码

请查看并给我建议如何解决屏幕开/关的问题

public class USSDService extends AccessibilityService {

public static String TAG = USSDService.class.getSimpleName();

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {


    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

    if (source != null) {
        //capture the EditText simply by using FOCUS_INPUT (since the EditText has the focus), you can probably find it with the viewId input_field
        AccessibilityNodeInfo inputNode = source.findFocus(AccessibilityNodeInfo.FOCUS_INPUT);
        if (inputNode != null) {//prepare you text then fill it using ACTION_SET_TEXT



        //saff 1
            if (text.indexOf("Default") >= 0) {
        Bundle arguments = new Bundle();
            arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,"0");
            inputNode.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);

        //"Click" the Send button
        List<AccessibilityNodeInfo> list = source.findAccessibilityNodeInfosByText("Send");
        for (AccessibilityNodeInfo node : list) {
            node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
        }
    }





    //staf 2


            if (text.indexOf("topUp") >= 0) {
                Bundle arguments = new Bundle();
                arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,"1");
                inputNode.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);

                //"Click" the Send button
                List<AccessibilityNodeInfo> list = source.findAccessibilityNodeInfosByText("Send");
                for (AccessibilityNodeInfo node : list) {
                    node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                }
            }





        }

        }
    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);
}
}    
公共类USSDService扩展了AccessibilityService{
公共静态字符串标记=USSDService.class.getSimpleName();
@凌驾
AccessibilityEvent上的公共无效(AccessibilityEvent事件){
AccessibilityNodeInfo source=event.getSource();
/*如果(event.getEventType()==AccessibilityEvent.TYPE\u WINDOW\u STATE\u CHANGED&!event.getClassName().equals(“android.app.AlertDialog”){//android.app.AlertDialog是标准配置,但并非适用于所有手机*/
如果(event.getEventType()==AccessibilityEvent.TYPE\u WINDOW\u STATE\u已更改&&!String.valueOf(event.getClassName()).contains(“AlertDialog”)){
返回;
}
如果(event.getEventType()==AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED&&(source==null | | |!source.getClassName().equals(“android.widget.TextView”)){
返回;
}
if(event.getEventType()==AccessibilityEvent.TYPE\u WINDOW\u CONTENT\u CHANGED&&TextUtils.isEmpty(source.getText()){
返回;
}
列出事件文本;
if(event.getEventType()==AccessibilityEvent.TYPE\u窗口\u状态\u已更改){
eventText=event.getText();
}否则{
eventText=Collections.singletonList(source.getText());
}
String text=processUSSDText(eventText);
if(TextUtils.isEmpty(text))返回;
//关闭对话框
performGlobalAction(GLOBAL_ACTION_BACK);//这仅适用于4.1+版本
如果(源!=null){
//只需使用FOCUS_输入即可捕获EditText(因为EditText具有焦点),您可能可以通过viewId输入_字段找到它
AccessibilityNodeInfo inputNode=source.findFocus(AccessibilityNodeInfo.FOCUS\u输入);
如果(inputNode!=null){//准备文本,然后使用操作\设置\文本填充它
//saff 1
如果(text.indexOf(“默认”)>=0){
Bundle参数=新Bundle();
arguments.putCharSequence(AccessibilityNodeInfo.ACTION\u ARGUMENT\u SET\u TEXT\u CHARSEQUENCE,“0”);
inputNode.performAction(AccessibilityNodeInfo.ACTION\u SET\u文本、参数);
//单击“发送”按钮
List List=source.findAccessibilityNodeInfosByText(“发送”);
用于(AccessibilityNodeInfo节点:列表){
节点性能(AccessibilityNodeInfo.ACTION\u单击);
}
}
//staf 2
如果(text.indexOf(“topUp”)>=0){
Bundle参数=新Bundle();
arguments.putCharSequence(AccessibilityNodeInfo.ACTION\u ARGUMENT\u SET\u TEXT\u CHARSEQUENCE,“1”);
inputNode.performAction(AccessibilityNodeInfo.ACTION\u SET\u文本、参数);
//单击“发送”按钮
List List=source.findAccessibilityNodeInfosByText(“发送”);
用于(AccessibilityNodeInfo节点:列表){
节点性能(AccessibilityNodeInfo.ACTION\u单击);
}
}
}
}
Log.d(标签、文本);
//在这里处理USSD响应
}
私有字符串processUSSDText(列表事件文本){
for(字符序列:eventText){
String text=String.valueOf(s);
//如果文本是预期的ussd响应,则返回文本
如果(真){
返回文本;
}
}
返回null;
}
@凌驾
在中断时的公共无效(){
}
@凌驾
ServiceConnected()上受保护的void{
super.onServiceConnected();
Log.d(标记“onServiceConnected”);
AccessibilityServiceInfo=新的AccessibilityServiceInfo();
info.flags=AccessibilityServiceInfo.DEFAULT;
info.packageNames=新字符串[]{“com.android.phone”};
info.eventTypes=AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED | AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED;
info.feedbackType=可访问性服务info.FEEDBACK\u通用;
设置服务信息(信息);
}
}    
谢谢 求救