.NET MAUI中如何接收耳机按钮操作?问题排查求助
问题描述
我尝试用BroadcastReceiver结合ACTION_MEDIA_BUTTON接收耳机按键操作,但始终收不到事件。监听android.intent.action.PHONE_STATE的代码能正常工作(来电时可暂停音乐),说明代码逻辑本身没问题。网上没找到有效解决方案,实在不想通过蓝牙实现这个功能。另外我的应用用MediaElement NuGet包播放音乐,怀疑这个组件抢占了MediaButton事件,导致BroadcastReceiver收不到。试过GitHub Copilot给的多种方案,全都没用。
相关代码
MainActivity 代码
public class MainActivity : MauiAppCompatActivity { private PhoneCallReceiver _phoneCallReceiver; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); IntentFilter filterPhone = new IntentFilter(); filterPhone.AddAction("android.intent.action.MEDIA_BUTTON"); filterPhone.AddAction("android.intent.action.PHONE_STATE"); _phoneCallReceiver = new Platforms.Android.PhoneCallReceiver(); if (Build.VERSION.SdkInt >= BuildVersionCodes.Tiramisu) // Android 33 { RegisterReceiver(_phoneCallReceiver, filterPhone, ReceiverFlags.Exported); } else { RegisterReceiver(_phoneCallReceiver, filterPhone); } } // ... 其他代码 }
PhoneCallReceiver 代码
[BroadcastReceiver(Enabled = false, Exported = true)] public class PhoneCallReceiver : BroadcastReceiver { public delegate void PlayMusic(); static public PlayMusic DelegatePlayMusic; static bool tantQuePasRacroche = false ; public override void OnReceive(Context context, Intent intent) { System.Diagnostics.Debug.WriteLine("MaMusique", intent.Action); if (intent.Action == "android.intent.action.PHONE_STATE") { System.Diagnostics.Debug.WriteLine("MaMusique", "android.intent.action.PHONE_STATE"); string state = intent.GetStringExtra(TelephonyManager.ExtraState); if (state == TelephonyManager.ExtraStateRinging) { // 来电时的处理 if (!tantQuePasRacroche) { tantQuePasRacroche = true; DelegatePlayMusic(); } } else if (state == TelephonyManager.ExtraStateIdle) { // 通话结束时的处理 DelegatePlayMusic(); tantQuePasRacroche = false; } } else if (intent.Action == "android.intent.action.MEDIA_BUTTON") { // 音乐按键按下时的处理 System.Diagnostics.Debug.WriteLine("MaMusique", "android.intent.action.MEDIA_BUTTON"); KeyEvent keyEvent; if (Build.VERSION.SdkInt >= BuildVersionCodes.Tiramisu) // Android 13 (API 33) { keyEvent = intent.GetParcelableExtra(Intent.ExtraKeyEvent, Java.Lang.Class.FromType(typeof(KeyEvent))) as KeyEvent; } else { keyEvent = (KeyEvent)intent.GetParcelableExtra(Intent.ExtraKeyEvent); } System.Diagnostics.Debug.WriteLine($"Sending KeyEvent multimédia appuyé keycode = {keyEvent.KeyCode}"); if (keyEvent != null && keyEvent.Action == KeyEventActions.Down) { if (keyEvent.KeyCode == Keycode.MediaPlayPause) { // 处理播放/暂停按键事件 System.Diagnostics.Debug.WriteLine("MaMusique", "Sending KeyEvent Pause appuyé"); } else if (keyEvent.KeyCode == Keycode.MediaNext) { // 处理下一曲按键事件 System.Diagnostics.Debug.WriteLine("MaMusique", "Sending KeyEvent Next appuyé"); } else if (keyEvent.KeyCode == Keycode.MediaPrevious) { // 处理上一曲按键事件 System.Diagnostics.Debug.WriteLine("MaMusique", "Sending KeyEvent Previous appuyé"); } else if (keyEvent.KeyCode == Keycode.MediaPlay) { System.Diagnostics.Debug.WriteLine("MaMusique", "Sending KeyEvent Play appuyé"); } } } } }
Manifest配置

内容的提问来源于stack exchange,提问作者frousset
相关产品推荐
相关产品推荐

