1

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

这里是我做的:

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()); 
    } 
} 

当我在manifest.xml一切设置android:minSdkVersion18工作得很好。但是当我将其更改为8时,Eclipse给我一个警告,表示android.support.v4.*导入未被使用,并且出现错误Call requires API level 14 (current min is 8): android.view.accessibility.AccessibilityEvent#getSource

回答

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。

+0

谢谢,修正了片段。 – alanv