问题标签 [android-mediasession]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
228 浏览

android - 如何在 Android Auto 媒体应用中显示播放头位置/进度指示器?

我在一个支持 Android Auto 的 Android 音频应用上工作。一切正常,除了 Android Auto UI 没有像我在许多其他音频应用程序中看到的那样显示播放头位置/进度指示器。

下面的屏幕截图中有一个示例:进度指示器沿着控件顶部运行,在播放/暂停按钮上方。

带有进度指示器的 Android Auto 应用

我们的应用程序:没有进度指示器?嗯。 我的 Android Auto 音频应用。 没有进度指示器?

  1. 我正在向 MediaSessionCompat 提供持续时间以及其他媒体元数据,例如艺术家和标题。Android Auto 正确显示标题和艺术家元数据。
  2. 我通过 PlaybackStateCompat 将当前播放头位置提供给 MediaSessionCompat。Android Auto 正确反映了当前的播放状态。
  3. 当应用程序正在播放并且设备通过蓝牙连接到我的汽车时,我的汽车显示屏会显示当前播放头位置和来自我的应用程序的总持续时间。

创建 Android Auto 媒体应用程序的文档似乎都没有提及此 UI 细节。似乎它应该可以工作。有什么建议么?

0 投票
0 回答
510 浏览

android - 在 Android 8.0+ 中处理来自服务的媒体按钮?

我正在尝试使用 MediaSessionCompat 类从 Android 中的服务处理耳机挂钩以启动我的应用程序的操作,这与媒体播放器的目的不同。

现在,我编写的这段代码可以在 Android 7 及更低版本中运行,但不适用于 Android 8.0 及更高版本,我不知道为什么。

我试图将此代码放入 MainActivity 的 OnStart() 和我的服务的 onStartCommand 中,但什么也没发生。

我也试过把它留在我的清单中,但没有用。

我离开了我的接收器和我的服务,也许我在某个地方受到了委屈,或者任何人都可以帮助我理解为什么不起作用,不幸的是,Android 的文档对这件事毫无用处。

接收者:

服务:

0 投票
1 回答
2872 浏览

android - MediaSession 没有从 MediaStyle 通知中获得任何回调

我创建了一个扩展 MediaBrowserServiceCompat 的服务。此服务包含对我的播放器的引用并创建一个带有回调的新 MediaSession。每次播放器更改状态时,我都会更新 MediaSession 的播放状态并创建一个 MediaStyle 通知。当我开始在播放器中播放某些内容时,会显示通知,但通知中的按钮不会触发 MediaSession 回调,它们不会执行任何操作。我在 MediaSession 中设置了正确的标志,我将会话设置为活动,我在播放状态下设置了正确的操作,我将会话令牌传递给通知,但仍然没有从中获得任何回调. 我真的不知道我做错了什么。所有这些代码都在我的应用程序导入的模块中。

我的 NotificationHelper 类:

我的服务类:

}

MediaBrowserHelper 初始化服务:

}

显现:

0 投票
3 回答
1115 浏览

android - 当服务被系统自动杀死时取消Android通知

我有一个实现MediaBrowserServiceCompat. 播放音乐时,它在前台运行,并带有系统设为不可关闭的媒体控制通知。暂停时,它从前台出来,并保留通知。标准的东西。

当此服务被系统自动杀死时,通知不会被删除。

您可以通过将应用程序置于非前台暂停状态、离开应用程序并发出以下命令来模拟这一点:

通知仍然存在。您会收到以下 Logcat 消息:

似乎没有调用服务上的明显钩子(例如onDestroy,等) - 它似乎被彻底杀死。onTaskRemoved因为服务是用 启动的START_NOT_STICKY,所以我们也不会onCreate在新实例上被调用。

对此的部分解决方案是使服务具有粘性,并在服务恢复时取消通知。但是,这可能需要很长时间才能真正发生,在此期间通知不起作用,因此并不理想。它还可能产生进一步的后果。

其他应用程序似乎对此没有任何问题。

重复此场景(暂停、离开应用程序)并执行命令,例如在 Google Play 音乐上:

或 Spotify:

你会发现他们的通知会立即消失,就好像它们在拆解时被取消了一样。

他们可能会做些什么来实现这一点?

0 投票
1 回答
284 浏览

android - 从 MediaBrowserServiceCompat 中的 Room 加载项目

我正在使用 Android 架构组件开发音频应用程序。我有一个服务,它扩展MediaBrowserServiceCompat和一个带有MediaBrowserCompat.

当我在服务的onLoadChildren()方法中对歌曲进行硬编码时,一切都运行良好。但我将我的歌曲存储在 Room 数据库中,并希望将它们加载到该onLoadChildren()方法中。这就是我挣扎的地方。

我尝试加载歌曲的方法有两种:

1) 宋道:

服务:

这样,我得到一个错误,房间查询是在主线程上执行的。一种可能的方法可能是将方法封装到 AsyncTask 中,但我相信还有更好的方法。

2) 宋道:

服务:

这样,我不知道如何处理 LiveData 歌曲。它们不能在循环中迭代并且可能也不能被观察到,因为没有任何东西可以用作 LifecycleOwner(观察方法的第一个参数)。

我找不到任何关于如何解决这个用例的最佳实践。我想要一个 SPOT(单点真实性)课程,其中包含应用程序中的所有歌曲。然后可以在服务中使用它来向应用程序的 UI (RecyclerView) 以及其他应用程序 (Android Auto) 提供数据。我想从应用程序的任何地方访问这些歌曲 - 当我添加新歌曲或从房间数据库中删除任何歌曲时,列表应该会自动更新。

你建议如何实施这样的事情?提前感谢您的任何建议。

0 投票
1 回答
378 浏览

android - 永远不会调用 MediaSession 回调

我创建了一个带有一个活动的简单应用程序,并MediaSession在其onCreate方法中创建了一个

但是,当我运行应用程序并使用外部媒体按钮时,永远不会调用回调。有什么想法我可能会错过吗?

0 投票
1 回答
1008 浏览

java - 在 connect() 之后未调用 MediaBrowserCompat.ConnectionCallback.onConnected()

我正在为 android 创建一个播放器应用程序,并希望MediaControllerCompat从任何 UI 类访问。为此,我使用MediaBrowserCompat类,我试图将它连接到我的MediaBrowserServiceCompat并获得MediaControllerCompatMediaSessionCompat.Token已经设置在我的Service.

我试过MediaBrowserCompat.connect() 从不调用 onConnected 或任何 MediaBrowserCompat.ConnectionCallback 方法解决方案,但它没有帮助。

TortoiseActivity.java

服务.java

SmallPlayerFragment.java

结果,我得到了 NullPointer

当试图得到MediaControllerCompat.TrasportControls. MediaControllerCompat绝对是空的。我在 Callback 的 onConnected() 中设置了断点,但线程不会在其上挂起。所以,我可以得出结论,没有调用回调。

0 投票
0 回答
27 浏览

android - 来自 MediaBrowserCompat 支持服务的 getIem 方法

在我的应用程序中,我必须从连接的服务中获取媒体项目,然后从服务中获取它们谷歌的文档说我使用 getItem 方法。但是,正如文档所说,有些服务不支持这种方法,就我而言,目前唯一不支持它的服务是蓝牙。如何获得“无获取物品支持”服务列表?

我在文档上搜索了一种获取非支持服务列表的方法,或者一种检查服务是否支持但我没有成功的方法。此外,我虽然会列出不受支持的服务并检查是否列出了当前服务,但这种方法的问题是,如果用户安装了另一个不支持 getItem 的应用程序,它将不会被列出并且它会崩溃它试图调用获取项目

我想找到一种更有效的方法来检查服务是否支持 getItem

0 投票
0 回答
40 浏览

android - 使用 OneTimeWorkRequest 暂停 MediaBrowserServiceCompat 音频

一段时间后,我需要在我的应用中暂停音频播放。我正在使用OneTimeWorkRequest

我正在使用MediaBrowserServiceCompat课程来播放音频,但我不确定如何暂停Worker课程中的音频。我尝试做这样的事情,但它不起作用:

0 投票
2 回答
4473 浏览

android - 捕捉android媒体按钮事件

我有一个应用程序可以启动前台服务来播放一些媒体,我希望能够使用智能手表/耳机上的媒体按钮来控制它,并通过媒体样式通知等来控制它。

我无法让媒体按钮始终如一地工作。在日志中,我可以看到它们经常被发送到其他应用程序,即使我最后开始了 MediaSession 和播放。

但是,尽管有一个我 setActive(true) 的媒体会话并定义了媒体回调,但我无法让它工作?

显现:

代码(注意包,在 android 10 中很难找到正确的包组合,这些包可以一起工作并给我 MediaStyle)...

构建.gradle

我已经坚持了一段时间,所以任何帮助将不胜感激。

日志:

此外,我看到音频权限错误,但我不确定这是否相关: