我正在构建一个针对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
。
答案 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。