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