代码之家  ›  专栏  ›  技术社区  ›  Norman

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

  •  1
  • Norman  · 技术社区  · 10 年前

    我正在构建针对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 回复  |  直到 10 年前
        1
  •  2
  •   alanv    10 年前

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

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

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