8

Android で、現在選択されているビューのビュー ID の取得に依存するアクセシビリティ サービスを作成していますが、一部のデバイス (Nexus 6P 6.0.1、Samsung Galaxy S6 edge+ 5 + 6.0.1) では、ビュー ID を取得せず、他のもの (HTC One M8 5.0.1) では問題なく動作します。一部のデバイスでは正常に動作するため、コードに問題はないと確信していますが、最小限のテスト ケースを以下に掲載しました。

すべてのデバイスでサービス レポート ID を取得するのを手伝ってくれる人はいますか?

A11y サービス

public class ViewIdLoggingAccessibilityService extends AccessibilityService {
  @Override
  public void onAccessibilityEvent(AccessibilityEvent event) {
      AccessibilityNodeInfo source = event.getSource();
      if (source == null) {
          Log.d("onAccessibilityEvent", "source was null for: " + event);
      } else {
          String viewIdResourceName = source.getViewIdResourceName();
          Log.d("onAccessibilityEvent", "viewid: " + viewIdResourceName);
      }
  }

  @Override
  public void onInterrupt() {
      Log.d("!# onInterrupt", "called");
  }
}

AndroidManifest.xml

<manifest package="com.example.a11yservice"
          xmlns:android="http://schemas.android.com/apk/res/android"
    >

  <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme"
      >

    <service
        android:name=".ViewIdLoggingAccessibilityService"
        android:label="@string/view_id_logging_service_label"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
        >
      <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
      </intent-filter>
      <meta-data
          android:name="android.accessibilityservice"
          android:resource="@xml/serviceconfig"
          />
    </service>

  </application>

</manifest>

serviceconfig.xml

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagReportViewIds"
    android:canRetrieveWindowContent="true"
    android:notificationTimeout="100" />
4

2 に答える 2

10

これは既知の問題であり、しばらく前に AOSP イシュー トラッカーに投稿されました。ここで問題のステータスを確認できます:「アクセシビリティの問題: flagReportViewIds は Android M の実際のデバイスには影響しません」。

残念ながら、最新の Android 7.0 でも問題は存在しますが、簡単な回避策を見つけました。refresh()オブジェクトのメソッドを呼び出しAccessibilityNodeInfoて更新し、id を含むすべての欠落データを収集できます。

そんな感じ:

public void onAccessibilityEvent(AccessibilityEvent event) {
    AccessibilityNodeInfo ani = event.getSource();
    if (ani != null) {
        ani.refresh(); // to fix issue with viewIdResName = null on Android 6+
    }
}
于 2016-09-22T11:56:05.057 に答える
3

viewId が利用できない場合、フォーカスされた要素のクエリが機能しているように見えることがわかりました。

    AccessibilityNodeInfo source = findFocus(AccessibilityNodeInfo.FOCUS_INPUT);
    viewIdResourceName = source.getViewIdResourceName();

正しいビュー ID を返します

于 2016-04-22T12:36:22.960 に答える