Java 是否可以跳过Android应用程序中的曲目?

Java 是否可以跳过Android应用程序中的曲目?,java,android,spotify,Java,Android,Spotify,我计划为Android 2.1做一个应用程序,每分钟(通过我希望Android中存在的“下一个”)为使用音频设备atm的应用程序更改歌曲 所以,如果我已经在后台跑步,播放音乐,我可以通过我的程序切换到下一首曲目吗 如果我不清楚什么,请告诉我。 提前谢谢 音乐应用程序没有通用的音频传输API,因此您需要查看所针对的音乐应用程序是否公开了服务绑定或意图。如果没有,您将无法执行此操作。系统音乐主屏幕小部件将向内置音乐播放器发送此意图: final ComponentName serviceNa

我计划为Android 2.1做一个应用程序,每分钟(通过我希望Android中存在的“下一个”)为使用音频设备atm的应用程序更改歌曲

所以,如果我已经在后台跑步,播放音乐,我可以通过我的程序切换到下一首曲目吗

如果我不清楚什么,请告诉我。
提前谢谢

音乐应用程序没有通用的音频传输API,因此您需要查看所针对的音乐应用程序是否公开了服务绑定或意图。如果没有,您将无法执行此操作。

系统音乐主屏幕小部件将向内置音乐播放器发送此意图:

    final ComponentName serviceName = new ComponentName(context, 
        MediaPlaybackService.class);
    intent = new Intent(MediaPlaybackService.NEXT_ACTION);
    intent.setComponent(serviceName);
    pendingIntent = PendingIntent.getService(context,
            0 /* no requestCode */, intent, 0 /* no flags */);
    views.setOnClickPendingIntent(R.id.control_next, pendingIntent);
但这似乎需要一些黑客才能在音乐应用程序中实现外部软件包,因为MediaPlaybackService只接受明确的意图,无法从外部访问。不过,这似乎表明,通过一些黑客手段是可能的


但即便如此,正如罗曼所说,并不是每个音乐播放器都会尊重这一意图。你必须亲自检查Spotify/Pandora/Last.fm,看看他们是否有任何可用的绑定意图。

我知道这是一个有点老的问题,但我花了一些时间来搜索这里提到的其他内容

有一个变通方法-播放媒体按钮操作。有一个catch-receiver可以识别广播是来自系统还是来自另一个应用程序,因此他们可以忽略非系统广播

Intent i = new Intent(Intent.ACTION_MEDIA_BUTTON);
synchronized (this) {
            i.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT));
            sendOrderedBroadcast(i, null);

            i.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT));
            sendOrderedBroadcast(i, null);
 }

刚刚发布了一个相关的答案


使用AudioManager的dispatchMediaKeyEvent()方法和已定义的KeyEvent,对于我来说,使用最新的SDK是可行的。

看起来可以使用AudioManager注入媒体密钥

下面是问题的一个片段

同样的方法,您可以注入PlayPause按钮和其他一些按钮。
我已经在一个控制Youtube的后台服务中对它进行了测试,它在安卓6上运行正常这听起来像是我想要的!我会更深入地研究一下,尝试一下。我还没用Spotify试过。但是我无法让代码正常工作,你想把它放在一个如何使用它的上下文中吗?我对这整件事还不熟悉。经过一番挖掘后,我更新了一些细节——毕竟看起来很不愉快。@parse我知道这件事已经三年多了,但你成功了吗?@SkyKelsey恐怕我没有太感谢你!在谷歌音乐应用程序中表现得很有魅力。谢谢你@Adam Ch你的答案比一句感谢更有价值!!您的解决方案是无价的,
synchronized
的部分是什么?(为什么需要它)
this.mAudioManager = (AudioManager) this.context.getSystemService(Context.AUDIO_SERVICE);

long eventtime = SystemClock.uptimeMillis();

KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT, 0);
mAudioManager.dispatchMediaKeyEvent(downEvent);

KeyEvent upEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT, 0);
mAudioManager.dispatchMediaKeyEvent(upEvent);