在API级别8上使用API​​级别18的Android AccessabilityService功能

时间:2014-02-20 09:12:30

标签: android api accessibility android-support-library accessibilityservice

我正在构建一个针对API级别8的AccessabilityService,但我想使用API​​级别18(getViewIdResourceName())中引入的功能。这可以通过使用Android支持库v4实现,因为此功能可用there。 我已经启动了库running,但我不知道如何更改我的代码以使用它。

这就是我的所作所为:

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

1 个答案:

答案 0 :(得分: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。