VoiceView stops reading content as soon as I enter my app

:backhand_index_pointing_right: Bug Description


1. Summary

With VoiceView enabled on the Fire Stick, when I launch my WebView application, VoiceView stays completely silent regardless of the changes I made to the app

Bug Severity

  • Impacts operation of app
  • Blocks current development
  • Improvement suggestion
  • Issue with documentation (If selected, please share the doc link and describe the issue)
  • Other

2. Steps to Reproduce

  1. Enable VoiceView in the settings with default parameters
  2. Run a simple app that just renders a WebView component redirecting to a web page

3. Observed Behavior

VoiceView doesn't say anything, whether using proper ARIA attributes on DOM elements, AccessibilityInfo.announceForAccessibility with window.ReactNativeWebView.postMessage(), or a <div aria-live="assertive" aria-atomic="true">.

4. Expected Behavior

Describe what you expected the SDK to do under normal operation.

At least one of these approaches should work. Preferably the aria-live="assertive" approach or AccessibilityInfo for easier standardization across other TV OS

4.a Possible Root Cause & Temporary Workaround

I tried:

  • Upgrading to the latest Vega SDK

  • Switching from @amzn/ packages to @amazon-devices/ packages

  • On the React Native side, using onMessage on the WebView and running AccessibilityInfo.announceForAccessibility (both from react-native and @amazon-devices/react-native-kepler) in combination with window.ReactNativeWebView.postMessage()

  • Using a div in the body: <div aria-live="assertive" aria-atomic="true">

  • Adding aria-label, role, etc., to my components

  • Adding a React Native <Text> attribute to see if it would be read

  • Adding/removing the hasTVPreferredFocus prop in the WebView

  • Editing the manifest.toml to add the com.amazon.devconf.privilege.accessibility privilege

In every case, the result was the same: VoiceView worked properly on the Vega menus, but as soon as the app started, I got no output from VoiceView and no errors in the console.

I even tried wrapping AccessibilityInfo.announceForAccessibility() in a try/catch block to see if it would throw an error, but it didn’t. Instead, it executed without saying anything and without throwing.

5. Logs or crash report

N/A

6. Environment

Active SDK Version: 0.22.6150
Vega CLI Version: 1.2.18

  • OS Information:

    NAME="OS"
    OE_VERSION="4.0.0"
    OS_MAJOR_VERSION="1"
    OS_MINOR_VERSION="1"
    RELEASE_ID="14"
    OS_VERSION="1.1"
    BRANCH_CODE="TV Ship day60"
    BUILD_DESC="OS 1.1 (TV Ship day60/101)"
    BUILD_FINGERPRINT="4.0.249302.0(3072cab629675a74)/101N:user/release-keys"
    BUILD_VARIANT="user"
    BUILD_TAGS="release-keys"
    BUILD_DATE="Sat Mar 14 22:24:12 UTC 2026"
    BUILD_TIMESTAMP="1773527052"
    VERSION_NUMBER="1401010010120"
    

7. Example Code Snippet / Screenshots / Screengrabs

metro.config.js

const { getDefaultConfig } = require('@react-native/metro-config');

module.exports = getDefaultConfig(__dirname);

Simplified App.tsx

import * as React from 'react';
import { BackHandler, StyleSheet, View } from 'react-native';
import { APP_URL, PACKAGE_NAME } from '@env';
import WebView from '@amazon-devices/webview';

export const App = () => {
  const styles = StyleSheet.create({
    container: {
      flex: 1
    },
  });

  return (
    <View style={styles.container}>
      <WebView
        mediaPlaybackRequiresUserAction={false}
        hasTVPreferredFocus={true}
        domStorageEnabled={true}
        source={{ uri: APP_URL }}
        allowSystemKeyEvents={true}
        javaScriptEnabled={true}
        onCloseWindow={() => {
          BackHandler.exitApp();
        }}
      />
    </View>
  );
};

Simplified package.json

{
  "dependencies": {
    "@amazon-devices/react-native-kepler": "~2.0.0",
    "@amazon-devices/webview": "~3.3.0",
    "react": "18.2.0",
    "react-native": "0.72.0"
  },
  "devDependencies": {
    "@amazon-devices/kepler-cli-platform": "~0",
    "@babel/core": "^7.20.0",
    "@babel/runtime": "^7.20.0",
    "@babel/traverse": "7.22.8",
    "@react-native-community/cli": "11.3.2",
    "@react-native/eslint-config": "0.72.2",
    "@react-native/metro-config": "^0.72.6",
    "@testing-library/react-native": "^7.2.0",
    "@types/jest": "^28.0.0",
    "@types/react": "^18.0.24",
    "@types/react-test-renderer": "^18.0.0",
    "@typescript-eslint/eslint-plugin": "^5.30.0",
    "babel-jest": "^28.0.0",
    "eslint": "^8.12.0",
    "jest": "^28.0.0",
    "metro-react-native-babel-preset": "^0.76.5",
    "mustache": "^4.2.0",
    "npm-run-all": "^4.1.5",
    "prettier": "^2.6.2",
    "react-native-dotenv": "^3.4.11",
    "react-test-renderer": "18.2.0",
    "ts-jest": "^28.0.0",
    "typescript": "4.8.4"
  },
  "kepler": {
    "os": "vega",
    "projectType": "application",
    "appName": "XXXX",
    "targets": [
      "tv"
    ],
    "api": 0.1
  }
}

manifest.toml

schema-version = 1

[package]
title = "XXXXXXX"
version = "0.1.0"
id = "XXX.XXX.XXX.XXX.XXX"
icon = "@image/XXX.png"

[components]
[[components.interactive]]
id = "XXX.XXX.XXX.XXX.XXX.main"
categories = ["com.amazon.category.main"]
runtime-module = "/com.amazon.kepler.keplerscript.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"

[wants]

[[wants.service]]
id = "com.amazon.webview.renderer_service"

[[wants.service]]
id = "com.amazon.inputmethod.service"

[[wants.service]]
id = "com.amazon.media.server"

[[wants.service]]
id = "com.amazon.mediametrics.service"


[[wants.service]]
id = "com.amazon.mediabuffer.service"
[[wants.service]]
id = "com.amazon.mediatransform.service"


[[wants.service]]
id = "com.amazon.audio.stream"

# Required for audio management features to work in WebView,
# Features like audio focus, volume control, etc
[[wants.service]]
id = "com.amazon.audio.control"

# To enable accessibility support for your app,
# it's highly recommended you add UCC service with Service Registrar
[[wants.service]]
id = "com.amazon.kepler.ucc.publisher"
[[wants.service]]
id = "com.amazon.serviceregistrar"

[[wants.service]]
id = "com.amazon.drm.key"
[[wants.service]]
id = "com.amazon.drm.crypto"

[[wants.service]]
id = "com.amazon.gipc.uuid.*"

[offers]
[[offers.service]]
id = "com.amazon.gipc.uuid.*"

[needs]
[[needs.module]]
id = "/com.amazon.kepler.webview@IWebView"

[[needs.privilege]]
id = "com.amazon.devconf.privilege.accessibility"

[[needs.privilege]]
id = "com.amazon.privilege.security.file-sharing"

Hi @Maxime_Bourand

Welcome to Amazon Developer Community!!

Root cause: The AccessibilityInfo import from the wrong package. On Vega, the platform-specific implementation lives in @amzn/react-native-kepler and using the standard react-native or @amazon-devices/react-native-kepler version may silently succeed without actually triggering VoiceView - which matches your observation that announceForAccessibility() executes without error but says nothing.

You should try changing your import to import { AccessibilityInfo } from "@amzn/react-native-kepler" as shown here and verify your web content uses proper semantic HTML with ARIA attributes. If aria-live still doesn’t work, the postMessage bridge pattern with the correct import is the recommended workaround.

Warm regards,
Ivy

HI @Ivy_Mahajan , I tried adding "@amzn/react-native-kepler": "~2.0.0" to the dependencies of my package.json, and running npm i, but I get a 401 error :

npm error code E401
npm error 401 Unauthorized - GET ``https://k-artifactory-external.labcollab.net/artifactory/api/npm/kepler-npm-prod-local/@amzn%2Freact-native-kepler

Am I missing something?

But to be honest, I’m not sure it would fix the issue anyway, because the reason I switched to the @amazon-devices/* packages was because it didn’t work with the @amzn ones

Let me deep dive into this and get back to you.

Warm Regards,
Ivy

Hi @Maxime_Bourand,

Thank you for the detailed bug report and all the troubleshooting steps you’ve already completed.

First, I want to correct the earlier response, the @amzn/react-native-kepler package has been updated to @amazon-devices/react-native-kepler, which you’re already using correctly. We apologize for the confusion. Please refer to the updated v0.22 accessibility guide here: Accessibility Guide for Web Apps | Design and Develop Vega Apps

Regarding the VoiceView silence issue: Your implementation follows our documented guidelines correctly. Our team is investigating this issue and will provide an update as soon as we have more information.

We appreciate your patience and the detailed information you’ve provided. This helps us prioritize and address the issue more effectively. I’ll keep you posted on any progress.

Best regards,
Aishwarya