You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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配置

Manifest配置截图

内容的提问来源于stack exchange,提问作者frousset

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 06:55:55