6.8 KiB
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)
构建与运行
- 用 Android Studio 打开本项目根目录(
tv文件夹)。 - 等待 Gradle 同步完成。
- 连接 Android TV 设备或启动 TV 模拟器:
- 设备:开启开发者选项与 USB 调试,用 USB 连接电脑。
- 模拟器:Device Manager → Create Device → 选择 TV 设备(如 “TV (1080p)”)→ 选择系统镜像并启动。
- 点击 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. 确认设备已连接
adb devices
应看到至少一行设备(如 emulator-5554 device)。若为 offline 或 unauthorized,先处理连接/授权。
2. 多设备时指定当前 TV 设备
若列表里有多台设备,必须指定要调试的那台:
adb -s emulator-5554 forward tcp:8767 tcp:8766
把 emulator-5554 换成你 adb devices 里那台 TV 模拟器的序列号。
3. 使用 adb forward(Windows 上 reverse 可能不监听,用 forward)
adb forward --remove tcp:8767
adb forward tcp:8767 tcp:8766
多设备时加 -s <设备号>,例如:adb -s emulator-5554 forward tcp:8767 tcp:8766。
4. 确认转发已生效
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 时
按顺序做:
-
确认本机 8767 有进程在听(PowerShell 或 CMD):
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
- 用设备号再绑一次:
-
确认模拟器里服务已启动:在 TV 模拟器里打开 TV 浏览器 → 点一次 「手机遥控」(可再关弹窗)→ 在 TV 里点「在电视上打开」能打开 127.0.0.1:8766 的页面。若 TV 里都打不开,先解决模拟器内 8766 再试电脑 8767。
-
本机防火墙:临时关 Windows 防火墙或为“专用/本地”网络放行,再试
Invoke-WebRequest -Uri http://127.0.0.1:8767/ -UseBasicParsing。 -
换用 curl 试(若已安装):
curl -v http://127.0.0.1:8767/
8. 服务常驻说明
设备上的 8766 服务在点过一次「手机遥控」后常驻,关弹窗不关服务。请务必先完成「5. 先在模拟器里启动遥控服务」再在电脑访问 8767。
9. 在电脑上确认 8767 是否通
在 PowerShell 或 CMD 里执行:
curl -v http://127.0.0.1:8767/
或在 PowerShell:
(Invoke-WebRequest -Uri http://127.0.0.1:8767/ -UseBasicParsing -TimeoutSec 5).StatusCode
- 若返回 200 或能看到 HTML:说明端口通,再试浏览器(可换无痕/别的浏览器)。
- 若 连接被拒绝 / Connection refused:多半是 TV 里弹窗没开或服务未启动,请先在 TV 里打开「手机遥控」弹窗再执行上述命令。
- 若 超时:检查本机防火墙或杀毒是否拦截本地 8767。
10. 一键执行(单设备时)
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。