java - event.source() 在 android 中返回 null

标签 java android xml service accessibilityservice

当使用辅助服务检测到 Activity 更改时,我正在实现将剪贴板文本粘贴到另一个应用程序的 EditText View 。

在我的辅助功能服务上,辅助功能事件检测效果很好。但是当调用 onAccessibilityEvent 时,代码 event.getSource() 返回 null 对象。

public class ClipBoardPasteService extends AccessibilityService {

ClipboardManager clipboard;

@Override
public void onCreate() {
    super.onCreate();
    Log.i("MyTag", "clipboard service created");
}

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    Log.i("MyTag", "ClipBoardPastedService : onAccessibilityEvent");
        clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);

        AccessibilityNodeInfo source = event.getSource();
        Log.i("MyTag", "source name : " + source.getViewIdResourceName());
        source.performAction(AccessibilityNodeInfo.ACTION_PASTE);

}


@Override
protected void onServiceConnected() {
    super.onServiceConnected();
    Log.i("MyTag", "ClipBoardPastedService : onServiceConnected");
    String[] packages = {"com.google.android.talk"};

    AccessibilityServiceInfo info = new AccessibilityServiceInfo();
    info.flags = AccessibilityServiceInfo.DEFAULT;
    info.packageNames = packages;
    //AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED
    info.eventTypes = AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED;
    info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
    setServiceInfo(info);
  }
}

这是我的 AndroidManifest.xml 的一部分

<service
        android:name=".ClipBoardPasteService"
        android:enabled="true"
        android:label="@string/app_name"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
            <category android:name="android.accessibilityservice.category.FEEDBACK_SPOKEN" />
        </intent-filter>
        <!-- from ICS -->
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibility_service_config" />
    </service>

这是accessibility_service_config.xml

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:description="@string/service_description"
    android:packageNames="@null"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFlags="flagDefault"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:notificationTimeout="100"
    android:canRetrieveWindowContent="true"
android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"
/>

我搜索并发现了另一个 stackoverflow 的类似问题,但答案“Manifest 中缺少元数据”没有意义。我的代码有什么问题吗?

最佳答案

并非所有事件类型都有来源。您应该检查该事件是否属于具有源的类型,然后以不同的方式处理这些事件。

例如,TYPE_WINDOWS_CHANGED 没有源,但 TYPE_VIEW_SCROLLED 有。为此,您应该仔细阅读 Android 文档。尽管有一定的逻辑,但还是有点困惑。如果因糟糕的文档和 API 设计而陷入困惑。

另请注意,在您的配置中,您的代码将覆盖您的 XML。删除 xml 中的 packagenames 行。并删除了您连接的服务中的所有代码。您只需覆盖您在服务配置 XML 文件中所做的配置。

最后,如果您需要使用代码覆盖某些配置,对于某些动态更改,您应该始终(阅读“几乎总是”)这样做:

AccessibilityServiceInfo info = getServiceInfo();
//modify info to your liking
setServiceInfo(info);

这可确保您使用 XML 中的参数创建正确构造的服务信息以进行修改。这几乎总是设置全新配置的目的。

来源: http://developer.android.com/reference/android/view/accessibility/AccessibilityEvent.html

关于java - event.source() 在 android 中返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36788529/

相关文章:

java - 获取 wso2 esb 中内存消息存储中的消息数

java - 保持内存中更改与后端同步的好方法是什么

java - 为什么 JSON 响应是 200

java - 看起来像 JTextArea 的 JTextPane

android - 登录 API 服务器失败

android - React Native Android 上的启动屏幕很快变成白色

android - 无法获取 android.permission.CLEAR_APP_USER_DATA

java - Java UTF-8 字符集异常可能吗?

php - Google Contacts Api -> 删除了哪些联系人?

c# - StringWriter.ToString() 正在破坏 xml C#