yuqianhe
cb99db014e
feat: 绕过 OEM WifiP2pWfdInfo 被裁剪的 setter → 字段反射+方法枚举
...
WifiP2pWfdInfo 类存在于 MagicOS 但 setWfdEnabled/setDeviceType
等标准 setter 被 OEM 移除。新策略:
1. 枚举所有公开方法 + 字段,诊断 OEM 实际 API
2. 先尝试 3 参构造 (boolean, int, int)
3. 回退到无参构造 + 反射直接写字段(消除对 setter 的依赖)
4. 枚举 WifiP2pManager 的 setWfdInfo/相关方法
5. 备选方法名 setWifiDisplayInfo
2026-05-30 06:55:44 +00:00
yuqianhe
af397dbe77
chore: cleanup stray echo file
2026-05-30 06:49:49 +00:00
yuqianhe
24face5c9c
fix: Kotlin 编译错误 — Boolean.TYPE/Integer.TYPE 改用 javaPrimitiveType
2026-05-30 06:49:07 +00:00
yuqianhe
a1b821aa10
diagnostic: 添加 WFD_MARKER 强标记日志 + 分步日志
...
- Log.i 标记 WFD_MARKER 确保不会被 Log.d 级别过滤
- 每一步操作都加详细日志:类加载、实例创建、各方法调用
- 用 WFD_DEBUG 额外 tag 确保 grep wfd 也能匹配到
- catch 块全部用 Log.e 输出异常信息
- e.printStackTrace() 打印完整堆栈
- 用 WFD_MARKER_START/END 包裹方法体
2026-05-30 06:40:49 +00:00
yuqianhe
3ee99aa1b2
fix: WFD IE 反射参数类型修复 + 日志改为 Log.i
...
问题:getMethod 使用 Int::class.java (java.lang.Integer) 查
找方法,但方法参数是原生 int (Integer.TYPE),导致 NoSuchMethod
Exception 被静默吞掉,WFD IE 实际从未生效。
修复:
1. 所有原生类型参数改为 Boolean.TYPE / Integer.TYPE
2. 日志从 Log.d 改为 Log.i,确保 logcat 可见
3. 每步操作加详细日志,方便排查 OEM 裁剪情况
2026-05-30 06:30:11 +00:00
yuqianhe
1c9696d282
fix: 添加 WFD IE 设置使 Windows 能发现 Miracast 接收器
...
Wi-Fi Direct P2P Group 创建后还需设置 WFD (Wi-Fi Display)
Information Element,告诉 Windows 这个 P2P 设备是 Miracast 接收器。
没有这个 IE,Windows 的 Win+K 无法识别手机为无线显示器。
- trySetWfdInfo(): 反射调用 WifiP2pManager.setWfdInfo()
- 设置设备类型为 PRIMARY_SINK(Miracast 接收端)
- 设置控制端口 7236(RTSP 端口)
- 初始化时设置一次 + Group 创建成功后再次设置
2026-05-30 06:24:40 +00:00
yuqianhe
04b29e2ad4
fix: 添加 NEARBY_WIFI_DEVICES 权限 + P2P 创建重试
...
- 添加 android.permission.NEARBY_WIFI_DEVICES(Android 13+ 替代位置权限)
- ACCESS_FINE_LOCATION 设 maxSdkVersion=32(低版本用位置,高版本用附近设备)
- MainActivity 分 API 版本请求不同权限
- WiFiDirectManager.createGroup() 失败时自动重试(先 remove 再 retry)
- 改进权限提示信息,区分位置/附近设备/通知三种权限
2026-05-30 06:17:21 +00:00
yuqianhe
de2dbc763d
fix: statusOverlay 类型从 LinearLayout 改 ScrollView
...
布局文件 activity_main.xml 中将 statusOverlay 从 LinearLayout 改为
ScrollView,但代码中仍声明为 LinearLayout,导致 ClassCastException。
改为 ScrollView 并添加对应 import。
2026-05-30 06:02:01 +00:00
yuqianhe
febd02c8fe
feat: 手机使用体验 — 权限请求 + 使用指引 + P2P 信息 + Binder
...
新增功能:
- 运行时权限请求:位置权限(ACCESS_FINE_LOCATION)和通知权限
(POST_NOTIFICATIONS),含理由说明和引导至系统设置
- 使用指引:主界面显示分步连接指南(Win+K 操作说明)
- P2P 连接信息:Wi-Fi Direct 组 SSID 和密码实时显示
- MiracastBinder:onBind() 返回非 null Binder,Activity 绑定后
可直接调用服务方法
- ServiceStateListener:Activity 实时监听状态变更并更新界面
- 手机友好布局:ScrollView 适配小屏,步骤引导 + P2P 信息区
2026-05-30 05:53:04 +00:00
yuqianhe
a456cb40fe
fix: Android 16 前台服务崩溃 — 移除 FOREGROUND_SERVICE_MEDIA_PLAYBACK 的 maxSdkVersion
...
Android 16 上系统强制校验 foregroundServiceType=mediaPlayback 对
应权限的声明。之前设了 maxSdkVersion=34 导致 API 35+ 上权限未
声明,startForeground 抛出 SecurityException。
移除限制后该权限在所有版本都声明,低版本自动忽略未知权限。
2026-05-30 05:41:23 +00:00
yuqianhe
93469db573
fix: 手机启动闪退 — leanback required=false + Theme.AppCompat
...
- leanback required=true → false,允许手机安装
- Theme.Leanback → Theme.AppCompat.NoActionBar,手机不崩溃
- 布局文件使用标准 View(SurfaceView/TextView/Button),无 Leanback 专属组件
- colors.xml 中的颜色属性在 AppCompat 主题中同样有效
2026-05-30 05:27:24 +00:00
yuqianhe
73f1da05e8
feat: 添加桌面图标入口(LAUNCHER category)方便测试
...
MainActivity 现在同时支持 LEANBACK_LAUNCHER(Android TV 主屏 Apps 行)
和 LAUNCHER(桌面图标),方便在开发调试时快速启动应用。
2026-05-30 05:23:30 +00:00
yuqianhe
701902e96a
fix: WifiP2pConfig 旧构造函数在 API 34 已移除,改用默认构造函数+字段赋值
2026-05-30 05:12:45 +00:00
yuqianhe
11871fb37b
fix: 修复 11 处 Kotlin 编译错误(Byte/Int 比较、类型匹配、未解析引用等)
...
MediaRenderer.kt: Byte/Int 比较 → .toByte()(起始码/NAL 搜索)
RtpReceiver.kt: bitrate Int→Long(8L/2L)
TsDemuxer.kt: Byte/Int 比较 → .toByte()
RtspServer.kt: isActive → coroutineContext.isActive
RtspSession.kt: 补 sessionId 参数;getState()→getCurrentState()
WfdParser.kt: enum name→displayName(避 Enum 冲突)
SettingsActivity.kt: 补 import android.view.View
UibcServer.kt: KEYCODE 缺失改用整数直接量
WiFiDirectBroadcastReceiver.kt: 缺失常量改用字符串直接量
WiFiDirectManager.kt:Builder API 三级兼容(API 30+ MacAddress / 23-29 旧构造函数)
2026-05-30 05:09:41 +00:00
yuqianhe
b8fa7926ae
fix: minSdk=23 兼容性 — 自适应图标移至 mipmap-anydpi-v26,低版本用 PNG 回退
...
- ic_launcher.xml(adaptive-icon)从 mipmap-hdpi/xhdpi 移至 mipmap-anydpi-v26(仅 API 26+ 生效)
- 为 mipmap-mdpi/hdpi/xhdpi/xxhdpi/xxxhdpi 生成 PNG 回退图标(蓝底显示器图案)
- 修复 AAPT 编译错误: '<adaptive-icon> elements require a sdk version of at least 26'
2026-05-30 04:26:50 +00:00
yuqianhe
8a095eecc3
fix: 适配 Codespaces SDKMAN! 环境,不碰系统默认 java
...
- 移除 update-alternatives(对 SDKMAN! 无效)
- 纯 JAVA_HOME 方案:安装 JDK 17 到 /usr/lib/jvm,设置 JAVA_HOME
- 构建前用 /bin/java -version 硬性验证
- Gradle 通过 -Dorg.gradle.java.home 强制使用 JDK 17
- PATH 首位放 /bin 确保 gradlew 找到正确 JDK
2026-05-30 03:48:59 +00:00
yuqianhe
4acfeddaac
fix: 彻底修复 Codespaces JDK 检测与 Gradle 构建
...
- JDK 检测: 用 glob 扫描 /usr/lib/jvm/java-17-openjdk-* 而非固定路径
- JDK 切换: 独立 switch_to_jdk17() — update-alternatives + JAVA_HOME + hash -r + 版本验证
- Gradle 强制: 通过 -Dorg.gradle.java.home= 硬性指定 JDK 17,绕过系统默认
- 构建前验证: java -version 确认 JDK 17,不通过则报错退出
- platform-tools 加入 PATH 供 adb 使用
- 移除 set -e,避免 update-alternatives 非零退出吞掉错误
2026-05-30 03:46:49 +00:00
yuqianhe
cc06758098
fix: 修复 Codespaces 脚本 JDK 版本切换 + platform-tools 安装卡死
...
- 安装 JDK 17 后用 update-alternatives 强制切换默认版本
- 显式设置 JAVA_HOME + PATH 确保 Gradle 使用正确的 JDK
- platform-tools 安装时 yes 管道直接喂给 sdkmanager 防卡死
2026-05-30 02:33:45 +00:00
yuqianhe
635a46899b
chore: 添加 Codespaces APK 构建脚本 build.codespace.sh
2026-05-30 02:24:01 +00:00
yuqianhe
982584e470
docs: 更新 README 完整文档,覆盖五项改造详情
...
- Android 6-14 兼容说明
- 可配置设备名 + UIBC 触摸回传
- 分辨率/帧率设置 + SPS 自动检测
- 三级延迟模式配置表
- 完整技术栈说明、设置项使用指南、常见问题
2026-05-29 15:42:49 +00:00
yuqianhe
04fc7e53a4
V3: 分辨率/帧率设置+延迟优化
...
- ResolutionManager: 预设分辨率选择(640×480~1920×1080 @ 24/30/60fps)
+ 自动/手动模式持久化
- WfdParser.buildVideoFormats/buildWfdParameters: 动态分辨率参数
- SettingsActivity + activity_settings.xml: 分辨率选择UI(自动/手动RadioGroup+预设Spinner)
- TsDemuxer: H.264 SPS完整解析(width/height+cropping)自动分辨率检测
- LatencyManager: 三级延迟模式(Low/Medium/High)控制RTP缓冲/解码低延迟/丢帧策略
- MediaRenderer: updateLatencyConfig动态调参,条件启用KEY_LOW_LATENCY,智能丢帧
- RtpReceiver: 可配置bufferWatermark字段
- MiracastService: 串联ResolutionManager+LatencyManager到全栈
2026-05-29 15:39:28 +00:00
yuqianhe
9a2301cc1b
V2: 三项改造完成
...
1. Android 兼容性改造
- minSdk=23 (Android 6.0), targetSdk=34 (Android 14)
- Manifest 条件声明: foregroundServiceType(tools:targetApi=34), FOREGROUND_SERVICE_MEDIA_PLAYBACK(maxSdkVersion=34)
- API 级别守卫: KEY_LOW_LATENCY (Q+), 通知渠道 (O+)
2. 可配置设备名
- DeviceNameManager (SharedPreferences 存储, 默认回退 Build.MODEL)
- SettingsActivity (Leanback 设置界面)
- WiFiDirectManager 反射 setDeviceInfo 尝试设置 P2P 设备名
- RtspSession Server 头注入设备名
- 通知/主界面显示设备名
3. UIBC 触摸回传
- UibcServer (TCP 7237 接收 Windows 触控/鼠标/键盘事件)
- WfdParser UIBC 能力协商 (buildUibcCapability/parseUibcCapability)
- M3 握手协商 UIBC 能力
- InputManager 注入+回调双模式
2026-05-29 15:28:20 +00:00
yuqianhe
c095c58dbe
🎉 初始提交:AirDisplay - Android TV 无线显示器
...
将 Android TV 变成支持 Microsoft 无线显示适配器 (Miracast) 的无线显示器。
包含完整协议栈:
- Wi-Fi Direct P2P Group Owner
- RTSP M1-M8 握手 (TCP 7236)
- RTP/UDP 媒体流接收
- MPEG2-TS 实时解复用
- MediaCodec 硬件解码渲染 (H.264/H.265 + AAC)
总计 27 文件 / ~3,900 行 Kotlin 代码
2026-05-29 15:03:03 +00:00