无法拦截蓝牙耳机媒体按钮事件

时间:2019-08-13 07:03:04

标签: c# bluetooth xamarin.android

我正在尝试在C#Xamarin android应用程序上捕获蓝牙耳机媒体按钮事件(例如“下一步”按钮)。 我复制了在https://forums.xamarin.com/discussion/22122/headset-button-event-android-c找到的代码,但是单击耳机的按钮会在安装了耳机的手机上开始Spotify,而在没有耳机的电话上单击google的“播放音乐”应用。无论哪种方式,我的“ OnReceive”事件都不会触发。 请查看我已经尝试过的所有变体的注释掉的代码,但无济于事。

也播放优先级值。


got this under the manifest's <application> tag:

<receiver android:name="BroadcastReceiver">
    <intent-filter android:priority="2147483647">
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

and these permissions:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" /> 

and this is my MainActivity class:

[Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        [Obsolete]
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            SetContentView(Resource.Layout.activity_main);

            Android.Support.V7.Widget.Toolbar toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
            SetSupportActionBar(toolbar);

            var am = (AudioManager)this.GetSystemService(AudioService);
            var componentName = new ComponentName(PackageName, new MyMediaButtonBroadcastReceiver().ComponentName);
            am.RegisterMediaButtonEventReceiver(componentName);
        }

        public override bool OnCreateOptionsMenu(IMenu menu)
        {
            MenuInflater.Inflate(Resource.Menu.menu_main, menu);
            return true;
        }

        public override bool OnOptionsItemSelected(IMenuItem item)
        {
            int id = item.ItemId;
            if (id == Resource.Id.action_settings)
            {
                return true;
            }

            return base.OnOptionsItemSelected(item);
        }

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

[BroadcastReceiver] //(Enabled = true, Exported = false)
    [IntentFilter(new[] { "android.intent.action.MEDIA_BUTTON"})] // , BluetoothHeadset.ActionAudioStateChanged, BluetoothHeadset.ActionVendorSpecificHeadsetEvent
    public class MyMediaButtonBroadcastReceiver : BroadcastReceiver
    {
        public string ComponentName { get { return Class.Name; } }

        public override void OnReceive(Context context, Intent intent)
        {
            if (intent.Action != Intent.ActionMediaButton)
                return;

            var keyEvent = (KeyEvent)intent.GetParcelableExtra(Intent.ExtraKeyEvent);

            switch (keyEvent.KeyCode)
            {
                case Keycode.MediaPlay:
                    break;
                case Keycode.MediaPlayPause:
                    break;
                case Keycode.MediaNext:
                    break;
                case Keycode.MediaPrevious:
                    break;
            }
        }
    }

没有错误,但也没有发生任何其他事情。

1 个答案:

答案 0 :(得分:0)

感谢Leo的帮助,在此How register Broadcast Receiver for media button in Oreo?中找到了答案-主要是使用MediaSession并播放AudioTrack,而不是(显然已弃用?)BroadcastReceiver。

相关问题