可以从 Android 应用程序中跳过曲目吗?

Posted

技术标签:

【中文标题】可以从 Android 应用程序中跳过曲目吗?【英文标题】:Possible to skip track from an Android application? 【发布时间】:2011-02-09 04:34:23 【问题描述】:

我正计划为使用音频设备 atm 的应用程序创建一个适用于 android 2.1 的应用程序,该应用程序每分钟都会更改歌曲(通过我希望 Android 中存在的“下一个”)。

如果我已经在后台运行Spotify,正在播放音乐,我可以通过我的程序切换到下一个曲目吗?

如果我有任何不清楚的地方,请告诉我。 提前致谢!

【问题讨论】:

【参考方案1】:

我知道这是一个有点老的问题,但我花了一些时间搜索除此处提到的内容之外的其他内容。

有一种解决方法 - 广播媒体按钮操作。有一个问题 - 接收者可以识别广播是来自系统还是来自另一个应用程序,因此他们可以忽略非系统广播。

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);
 

【讨论】:

非常感谢!与 Google 音乐应用一起工作就像一个魅力。 谢谢@Adam Ch 你的回答比感谢更有价值!您的解决方案是无价的 synchronized 部分是干什么用的? (为什么需要)【参考方案2】:

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

【讨论】:

【参考方案3】:

刚刚发布了相关答案here

使用 AudioManager 的 dispatchMediaKeyEvent() 方法和定义的 KeyEvent 对我使用最新的 SDK 有效。

【讨论】:

【参考方案4】:

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

    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 只接受显式 Intent 并且无法从外部访问。不过,This thread 似乎表明它是可能的。

但即便如此,正如 Roman 所说,并非每个音乐播放器都会尊重该 Intent。您必须自己检查 Spotify/Pandora/Last.fm,看看他们是否有任何可用的意图来进行这样的绑定。

【讨论】:

这听起来像我所追求的!将进一步深入研究并尝试一下 无法让它工作,还没有在 Spotify 上尝试过。但我无法让代码正常工作,是否将其放在有关如何使用它的上下文中?我对整个 Intent-thingie 都不熟悉。 经过一番挖掘后更新了一些细节 - 毕竟看起来相当不愉快。 @parse 我知道这已经超过三年了,但是你能做到吗? @SkyKelsey 恐怕我没有【参考方案5】:

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

这是来自another问题的sn-p

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);

注入 PlayPause 按钮​​和其他一些按钮的方式相同。 我已经在控制 Youtube 的后台服务中对其进行了测试,它适用于 Android 6

【讨论】:

以上是关于可以从 Android 应用程序中跳过曲目吗?的主要内容,如果未能解决你的问题,请参考以下文章

从 iPhone 应用程序更新歌曲/曲目信息

如何在java中跳过过滤器链中的过滤器

在 Spring Boot OAuth2 中跳过 OAuth 用户批准

在 Fortran90 中从文本文件中跳过一行

在chartJS中跳过y轴上的小数点

PRISMA:如何在 prisma 常规类型中跳过 id 字段?