android 13(api 33)起 `intent.getparcelableextra(string)` 已废弃,导致 `intent.extrakeyevent` 返回 null;需改用带泛型类型参数的新方法 `getparcelableextra
在 Android 13(API level 33)及更高版本中,Intent.GetParcelableExtra(string) 方法被正式标记为 [Obsolete],其底层实现已不再返回 KeyEvent 实例,直接调用将始终返回 null —— 这正是您遇到 keyEvent == null 的根本原因。Xamarin.Android 虽未同步更新所有绑定签名,但已支持新式泛型重载,必须显式指定类型以确保正确反序列化。
请将 BroadcastReceiver.OnReceive 中的事件提取逻辑替换为:
if (intent.Action == Intent.ActionMediaButton)
{
// ✅ 正确:显式指定 KeyEvent 类型,兼容 API 33+
var keyEvent = intent.GetParcelableExtra(Intent.ExtraKeyEvent);
if (keyEvent == null)
{
Log.Warn("MyMediaButtonReceiver", "KeyEvent is null — check Android version and manifest permissions.");
return;
}
switch (keyEvent.KeyCode)
{
case Keycode.Headsethook:
if (keyEvent.Action == KeyEventActions.Down)
HandlePlayPause();
break;
case Keycode.MediaPlay:
case Keycode.MediaPause:
case Keycode.MediaPlayPause:
if (keyEvent.Action == KeyEventActions.Down)
HandlePlayPause();
break;
case Keycode.MediaNext:
if (keyEvent.Action == KeyEventActions.Down)
HandleNext();
break;
case Keycode.MediaPrevious:
if (keyEvent.Action == KeyEventActions.Down)
HandlePrevious();
break;
default:
Log.Debug("MyMediaButtonReceiver", $"Unhandled key: {keyEvent.KeyCode}");
break;
}
}
)测试 KEYCODE_HEADSETHOOK 和 KEYCODE_MEDIA_* 行为;模拟器通常不触发真实媒体按键事件。GetParcelableExtra