# TV 浏览器 在 Android TV 上使用的简易网页浏览器应用,基于 WebView,支持遥控器 D-pad 导航。 ## 功能 - **网页浏览**:使用系统 WebView 加载网页,支持 JavaScript。 - **工具栏**:后退、前进、刷新、首页、地址栏、前往,均支持遥控器焦点。 - **遥控器操作**: - D-pad 在工具栏按钮和地址栏、WebView 之间切换焦点。 - 中心键/确认键在地址栏按下可执行“前往”。 - 返回键在可后退时先后退网页,否则退出应用。 - **从外部打开链接**:支持作为浏览器处理 `http`/`https` 链接(如从其他应用“在浏览器中打开”)。 ## 环境要求 - Android Studio Ladybug (2024.2.1) 或更高版本(推荐) - JDK 17 - 目标设备:Android TV(Android 5.0 / API 21+,且支持 Leanback) ## 构建与运行 1. 用 **Android Studio** 打开本项目根目录(`tv` 文件夹)。 2. 等待 Gradle 同步完成。 3. 连接 Android TV 设备或启动 TV 模拟器: - 设备:开启开发者选项与 USB 调试,用 USB 连接电脑。 - 模拟器:**Device Manager** → **Create Device** → 选择 TV 设备(如 “TV (1080p)”)→ 选择系统镜像并启动。 4. 点击 **Run**(绿色三角)或使用 `Shift+F10`,选择 TV 设备/模拟器,安装并运行应用。 在 TV 主屏的“应用”列表中可看到 **TV 浏览器**,进入后即可输入网址或使用默认首页进行浏览。 ## 项目结构概览 ``` tv/ ├── app/ │ ├── src/main/ │ │ ├── AndroidManifest.xml # TV 与浏览器声明、权限 │ │ ├── java/com/tv/browser/ │ │ │ └── BrowserActivity.kt # 主界面与 WebView 逻辑 │ │ └── res/ │ │ ├── layout/activity_browser.xml │ │ ├── values/strings.xml, colors.xml, themes.xml │ │ └── drawable/ # 图标、焦点背景等 │ ├── build.gradle.kts │ └── proguard-rules.pro ├── gradle/ │ ├── libs.versions.toml │ └── wrapper/gradle-wrapper.properties ├── build.gradle.kts ├── settings.gradle.kts └── README.md ``` ## 自定义 - **默认首页**:在 `app/src/main/res/values/strings.xml` 中修改 `default_home_url`(当前为 `https://www.google.com`),可改为任意合法 URL。 - **主题与颜色**:在 `res/values/colors.xml` 和 `themes.xml` 中调整。 - **TV 主屏图标**:替换 `res/drawable/banner.xml` 或使用 320×180 的横条图(banner)资源。 ## 许可 本项目仅供学习与参考使用。浏览器内核为系统 WebView,实际渲染与安全策略取决于设备系统版本。 启动模拟器 C:\Users\wucongxing\AppData\Local\Android\Sdk\emulator\emulator -avd Television_720p -dns-server 8.8.8.8,8.8.4.4 C:\Users\wucongxing\AppData\Local\Android\Sdk\platform-tools\adb forward tcp:8767 tcp:8766 --- ## 手机遥控 · 模拟器调试(电脑访问 127.0.0.1:8767 打不开时排查) 电脑浏览器访问 `http://127.0.0.1:8767` 需要先做 **adb 端口转发**(`adb forward`;Windows 上 `reverse` 可能不监听,用 `forward`),并按下面顺序排查。 ### 1. 确认设备已连接 ```bash adb devices ``` 应看到至少一行设备(如 `emulator-5554 device`)。若为 `offline` 或 `unauthorized`,先处理连接/授权。 ### 2. 多设备时指定当前 TV 设备 若列表里有多台设备,必须指定要调试的那台: ```bash adb -s emulator-5554 forward tcp:8767 tcp:8766 ``` 把 `emulator-5554` 换成你 `adb devices` 里那台 TV 模拟器的序列号。 ### 3. 使用 adb forward(Windows 上 reverse 可能不监听,用 forward) ```bash adb forward --remove tcp:8767 adb forward tcp:8767 tcp:8766 ``` 多设备时加 `-s <设备号>`,例如:`adb -s emulator-5554 forward tcp:8767 tcp:8766`。 ### 4. 确认转发已生效 ```bash adb forward --list ``` 应出现一行:`emulator-5554 tcp:8767 tcp:8766`(或你的设备号)。 ### 5. 先在模拟器里启动遥控服务(必须) - 在 **TV 模拟器**里打开 **TV 浏览器**,点击工具栏 **「手机遥控」**(弹窗会打开,服务启动;关掉弹窗后服务也会常驻)。 - 在模拟器里点弹窗的 **「在电视上打开」**,应能打开遥控页;若 TV 里能打开,说明本机 8766 服务正常。 - **未在模拟器里点过「手机遥控」时,电脑访问 8767 会连不上。** ### 6. 在电脑上再试 8767 确认上一步 TV 里能打开 127.0.0.1:8766 后,在电脑执行:`Invoke-WebRequest -Uri http://127.0.0.1:8767/ -UseBasicParsing` 或浏览器访问 `http://127.0.0.1:8767`。 ### 7. 电脑仍连不上 8767 时 按顺序做: 1. **确认本机 8767 有进程在听**(PowerShell 或 CMD): ```powershell netstat -ano | findstr :8767 ``` 应有至少一行 `LISTENING`(多为 adb)。若**没有任何输出**,说明 adb 未在本机监听 8767,可尝试: - 用设备号再绑一次:`adb -s emulator-5554 forward --remove tcp:8767`,再 `adb -s emulator-5554 forward tcp:8767 tcp:8766` - 重启 adb:`adb kill-server`,再 `adb start-server`,再执行上述 forward - 用**管理员身份**打开 PowerShell/CMD 再执行 `adb forward tcp:8767 tcp:8766` 2. **确认模拟器里服务已启动**:在 TV 模拟器里打开 TV 浏览器 → 点一次 **「手机遥控」**(可再关弹窗)→ 在 TV 里点「在电视上打开」能打开 127.0.0.1:8766 的页面。若 TV 里都打不开,先解决模拟器内 8766 再试电脑 8767。 3. **本机防火墙**:临时关 Windows 防火墙或为“专用/本地”网络放行,再试 `Invoke-WebRequest -Uri http://127.0.0.1:8767/ -UseBasicParsing`。 4. **换用 curl 试**(若已安装):`curl -v http://127.0.0.1:8767/` ### 8. 服务常驻说明 设备上的 8766 服务在**点过一次「手机遥控」后常驻**,关弹窗不关服务。请务必先完成「5. 先在模拟器里启动遥控服务」再在电脑访问 8767。 ### 9. 在电脑上确认 8767 是否通 在 **PowerShell** 或 **CMD** 里执行: ```powershell curl -v http://127.0.0.1:8767/ ``` 或在 PowerShell: ```powershell (Invoke-WebRequest -Uri http://127.0.0.1:8767/ -UseBasicParsing -TimeoutSec 5).StatusCode ``` - 若返回 **200** 或能看到 HTML:说明端口通,再试浏览器(可换无痕/别的浏览器)。 - 若 **连接被拒绝 / Connection refused**:多半是 TV 里弹窗没开或服务未启动,请先在 TV 里打开「手机遥控」弹窗再执行上述命令。 - 若 **超时**:检查本机防火墙或杀毒是否拦截本地 8767。 ### 10. 一键执行(单设备时) ```bash adb forward --remove tcp:8767 adb forward tcp:8767 tcp:8766 adb forward --list ``` 看到 `tcp:8767 tcp:8766` 后,**在 TV 应用里点一次「手机遥控」启动服务**,再在电脑访问 `http://127.0.0.1:8767`。