我正在尝试让我的应用程序打开 Google Play 音乐,然后模拟播放/暂停命令。我的应用程序能够成功启动 Google Play 音乐,但
downIntent
和 upIntent
KeyEvents 从未广播。我怀疑这是因为调用该方法只是调用我的主类上的方法,而不是播放音乐本身。广播这些 KeyEvents 以播放音乐的正确方法是什么?
Intent intent = getPackageManager().getLaunchIntentForPackage("com.google.android.music");
startActivity(intent);
Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
KeyEvent downEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent);
sendOrderedBroadcast(downIntent, null);
Intent upIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
KeyEvent upEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
upIntent.putExtra(Intent.EXTRA_KEY_EVENT, upEvent);
sendOrderedBroadcast(upIntent, null);
如果你想控制音乐播放器(当前正在播放的音乐播放器),有一种方法可以向其发送 KeyEvents:
if (mAudioManager == null) mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);
KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
mAudioManager.dispatchMediaKeyEvent(event);
注意:minSdk 需要19以上。
如果您能够使用 AccessibilityService,您可以将其 performGlobalAction() 方法与 GLOBAL_ACTION_KEYCODE_HEADSETHOOK 参数一起使用,从 API 级别 31 开始可用。
出于安全原因,您不能。 EXTRA_KEY_EVENT 不会做您认为它会做的事情 - 它不会将按键事件发送到系统。
如果您想定位特定应用程序,这可行,您甚至不必启动该应用程序。
sendBroadcast(new Intent(Intent.ACTION_MEDIA_BUTTON).putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE)).setPackage(packageName), null);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_BUTTON).putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE)).setPackage(packageName), null);
我找到了一位非常乐于助人的朋友,他为我指明了正确的方向。
Intent intent = new Intent("com.android.music.musicservicecommand");
intent.putExtra("command", "togglepause");
sendBroadcast(intent);
这似乎在 Android 4.x 上运行良好,但我还没有在 5.x 上测试过。