我正在尝试在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;
}
}
}
没有错误,但也没有发生任何其他事情。
答案 0 :(得分:0)
感谢Leo的帮助,在此How register Broadcast Receiver for media button in Oreo?中找到了答案-主要是使用MediaSession并播放AudioTrack,而不是(显然已弃用?)BroadcastReceiver。