1

我正在构建一个针对 API 级别 8 的 AccessabilityService,但我想使用 API 级别 18 ( getViewIdResourceName()) 中引入的功能。这应该可以通过使用 Android 支持库 v4 来实现,因为该功能在那里可用。我已经启动并运行了该库,但我不确定如何更改我的代码以使用它。

这是我所做的:

import android.accessibilityservice.AccessibilityService;
import android.view.accessibility.AccessibilityEvent;
import android.support.v4.accessibilityservice.*;
import android.support.v4.view.accessibility.*;
import android.support.v4.view.AccessibilityDelegateCompat;
import android.support.v4.view.ViewCompat;

public class MyAccessabilityService extends AccessibilityService {

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        Log.i(TAG, event.getSource().getViewIdResourceName());
    }
}

当我设置android:minSdkVersion为一切正常18时。manifest.xml但是当我把它改成8,Eclipse 会警告我android.support.v4.*没有使用导入,并且会出现错误Call requires API level 14 (current min is 8): android.view.accessibility.AccessibilityEvent#getSource

4

1 回答 1

2

您不能直接调用 event.getSource(),因为 API 8 上不存在该方法。相反,您需要使用 AccessibilityRecordCompat 和 AccessibilityNodeInfoCompat 类。

AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
AccessibilityNodeInfoCompat node = record.getSource();
Log.i(TAG, node.getViewIdResourceName());

这些类封装了实际的事件和节点对象,当方法在当前设备 API 上不可用时,它们提供存根实现。因此,如果您在 API 8 上运行上面的代码片段,它将因 NullPointerException 而崩溃,因为 getSource() 是 API 14+ 方法,并且在早期的 API 上总是返回 null。

于 2014-02-23T23:54:48.447 回答