首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >event.source()在安卓系统中返回null

event.source()在安卓系统中返回null
EN

Stack Overflow用户
提问于 2016-04-22 16:17:41
回答 2查看 1.5K关注 0票数 0

当使用可访问性服务检测到活动更改时,我实现了将剪贴板文本粘贴到另一个应用程序的EditText视图。

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

代码语言:javascript
运行
复制
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的一部分

代码语言:javascript
运行
复制
<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

代码语言:javascript
运行
复制
<?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中缺少元数据”没有任何意义。我的代码出了什么问题?

EN

回答 2

Stack Overflow用户

发布于 2016-04-22 21:24:31

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

例如,TYPE_WINDOWS_CHANGED没有源,但TYPE_VIEW_SCROLLED有源。为此,您应该通读Android文档。这有点令人困惑,尽管其中有一个逻辑。如果在糟糕的文档和API设计中搞砸了。

还要注意,在您的配置中,您的代码覆盖了XML。去掉xml中的packagenames行。并删除连接的on服务中的所有代码。您只是覆盖了您在服务配置XML文件中所做的配置。

最后,如果你需要使用代码覆盖一些配置,对于一些动态变化,你应该总是(读作“几乎总是”)这样做:

代码语言:javascript
运行
复制
AccessibilityServiceInfo info = getServiceInfo();
//modify info to your liking
setServiceInfo(info);

这可以确保您使用XML中的参数创建一个结构正确的服务信息以进行修改。这几乎总是比设置一个全新的配置更有意义。

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

票数 1
EN

Stack Overflow用户

发布于 2016-10-20 15:12:57

我也面临着同样的问题,通过将此权限添加到AndroidManifest.xml,我能够解决这个问题

代码语言:javascript
运行
复制
<application
    ...
    <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
    <service
       ...
    </service>
    ...
</application>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36788529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档