From 3ee99aa1b231175ddc7fc1920fad3d0442170eb1 Mon Sep 17 00:00:00 2001 From: yuqianhe Date: Sat, 30 May 2026 06:30:11 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20WFD=20IE=20=E5=8F=8D=E5=B0=84=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E7=B1=BB=E5=9E=8B=E4=BF=AE=E5=A4=8D=20+=20=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=94=B9=E4=B8=BA=20Log.i?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: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 裁剪情况 --- .../miracast/wifidirect/WiFiDirectManager.kt | 46 ++++++++++++------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/qwenpaw/miracast/wifidirect/WiFiDirectManager.kt b/app/src/main/java/com/qwenpaw/miracast/wifidirect/WiFiDirectManager.kt index f4a797e..992c35b 100644 --- a/app/src/main/java/com/qwenpaw/miracast/wifidirect/WiFiDirectManager.kt +++ b/app/src/main/java/com/qwenpaw/miracast/wifidirect/WiFiDirectManager.kt @@ -160,10 +160,14 @@ class WiFiDirectManager( * * WifiP2pWfdInfo 是公开类(API 29+),但 setWfdInfo 是 @SystemApi * 隐藏方法,需要反射调用。 + * + * 注意:部分 OEM(华为/小米等)可能裁剪了此 API,此时反射会失败。 */ private fun trySetWfdInfo() { + Log.i(TAG, "尝试设置 WFD IE (Wi-Fi Display)...") + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { - Log.d(TAG, "WFD IE 需要 API 29+,当前版本不支持") + Log.i(TAG, "WFD IE 需要 API 29+,当前版本不支持,跳过") return } try { @@ -171,24 +175,26 @@ class WiFiDirectManager( val wfdInfoClass = Class.forName("android.net.wifi.p2p.WifiP2pWfdInfo") val wfdInfo = wfdInfoClass.getDeclaredConstructor().newInstance() - // setWfdEnabled(true) - val setWfdEnabled = wfdInfoClass.getMethod("setWfdEnabled", Boolean::class.java) + // setWfdEnabled(boolean) — 注意用 Boolean.TYPE 匹配原生 boolean 参数 + val setWfdEnabled = wfdInfoClass.getMethod("setWfdEnabled", Boolean.TYPE) setWfdEnabled.invoke(wfdInfo, true) + Log.i(TAG, " ✓ setWfdEnabled(true)") - // setDeviceType(PRIMARY_SINK) — 1 = WFD_PRIMARY_SINK - // WFD 设备类型: 0=SOURCE, 1=PRIMARY_SINK, 2=SECONDARY_SINK, 3=SOURCE_OR_PRIMARY_SINK - val setDeviceType = wfdInfoClass.getMethod("setDeviceType", Int::class.java) - setDeviceType.invoke(wfdInfo, 1) // WFD_PRIMARY_SINK + // setDeviceType(int) — 1 = WFD_PRIMARY_SINK + // WFD 设备类型: 0=SOURCE, 1=PRIMARY_SINK, 2=SECONDARY_SINK + val setDeviceType = wfdInfoClass.getMethod("setDeviceType", Integer.TYPE) + setDeviceType.invoke(wfdInfo, 1) + Log.i(TAG, " ✓ setDeviceType(PRIMARY_SINK)") - // setControlPort(7236) — RTSP 端口 - val setControlPort = wfdInfoClass.getMethod("setControlPort", Int::class.java) + // setControlPort(int) — RTSP 端口 + val setControlPort = wfdInfoClass.getMethod("setControlPort", Integer.TYPE) setControlPort.invoke(wfdInfo, 7236) - // setSessionAvailable(true) - val setSessionAvailable = wfdInfoClass.getMethod("setSessionAvailable", Boolean::class.java) + // setSessionAvailable(boolean) + val setSessionAvailable = wfdInfoClass.getMethod("setSessionAvailable", Boolean.TYPE) setSessionAvailable.invoke(wfdInfo, true) - // WifiP2pManager.setWfdInfo(channel, wfdInfo, listener) — 隐藏 API + // WifiP2pManager.setWfdInfo(Channel, WifiP2pWfdInfo, ActionListener) — 隐藏 API val setWfdInfoMethod = p2pManager.javaClass.getMethod( "setWfdInfo", WifiP2pManager.Channel::class.java, @@ -198,20 +204,26 @@ class WiFiDirectManager( setWfdInfoMethod.invoke(p2pManager, p2pChannel, wfdInfo, object : WifiP2pManager.ActionListener { override fun onSuccess() { - Log.i(TAG, "WFD IE 设置成功,设备已注册为 Miracast 接收器 (PRIMARY_SINK)") + Log.i(TAG, "✓ WFD IE 设置成功,设备已注册为 Miracast 接收器 (PRIMARY_SINK)") } override fun onFailure(reason: Int) { - Log.w(TAG, "WFD IE 设置失败: reason=$reason(可能不支持)") + val r = when (reason) { + 0 -> "ERROR" + 1 -> "P2P_UNSUPPORTED" + 2 -> "BUSY" + else -> "UNKNOWN($reason)" + } + Log.w(TAG, "✗ WFD IE 设置失败: reason=$r") } } ) } catch (e: ClassNotFoundException) { - Log.d(TAG, "WifiP2pWfdInfo 类不存在(API < 29)") + Log.i(TAG, "✗ WifiP2pWfdInfo 类不存在(API < 29 或 OEM 裁剪): ${e.message}") } catch (e: NoSuchMethodException) { - Log.d(TAG, "setWfdInfo 方法不存在(非公开 API 不可用): ${e.message}") + Log.i(TAG, "✗ setWfdInfo 方法不存在(OEM 裁剪或 API 差异): ${e.message}") } catch (e: Exception) { - Log.d(TAG, "设置 WFD IE 失败: ${e.message}") + Log.i(TAG, "✗ 设置 WFD IE 失败: ${e.message}") } }