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
Enable VoiceView in the settings with default parametersRun 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
onMessageon the WebView and runningAccessibilityInfo.announceForAccessibility(both fromreact-nativeand@amazon-devices/react-native-kepler) in combination withwindow.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
hasTVPreferredFocusprop in the WebView -
Editing the
manifest.tomlto add thecom.amazon.devconf.privilege.accessibilityprivilege
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"