问题标签 [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 回答
830 浏览

java - IllegalStateException:在广播之外调用 finishBroadcast()

有没有人有办法解决吗?

此堆栈跟踪来自 Fabric crashlytics。

onCurrentPlayerChanged()只需拨打stopForeground服务电话。

这是 onCreate() 和 onStartCommand()

在 startRadio() 上,我mediaSession.setActive(true);也在 stopRadio() 中设置mediaSession.setActive(false)

在设置通知时设置 mediaSession 播放状态如下

和 onDestroy()

关于这个异常的原因的任何想法?

0 投票
2 回答
1540 浏览

android - 耳机按钮单击时应用程序崩溃

我已经构建了一个部署在 android google playstore 中的音频播放器。我正在使用 crashlytics 来监控崩溃和 ANR。最近我遇到了很多崩溃 MediaButtonReceiver。耳机咔哒声在许多设备中都能正常工作。但是有些设备会出现这个问题。

Crashlytics 报告 -

媒体会话代码 -

可能是什么问题以及如何解决这个问题?

我的想法 - 也许这是因为用户在我的应用程序仍在播放时打开了其他具有此功能的音乐应用程序。

0 投票
0 回答
179 浏览

android - 在具有相同 MediaSession 的两个 MediaController 之间进行通信

假设我有两个活动活动 A 和活动 B。

MediaBrowser在 Activity A 中创建了一个对象,并在onConnected它的回调中创建了MediaController带有 mediaSession 的对象。

现在我想要MediaControllerActivity B 中的另一个,以便如果 mediaSession 中发生任何更改,那么它将反映在两个活动中,并且可以被两者赶上,mediaControllers并且可以更新它们各自的 UI。

我怎样才能做到这一点。

0 投票
1 回答
1123 浏览

android - 如何使用 Android MediaSessionCompat 获取通知回调

我在使用 Android 的 MediaSession 时遇到了一些困难。

我一直在研究应该从 url 流式传输的原型无线电应用程序。

到目前为止,我已经将它与前台服务一起使用,该服务可以通过主屏幕中的按钮进行控制。音频按预期继续超出应用程序的宽度,但是我有一个通知,根据播放状态显示播放或停止按钮。

我的问题是这个按钮不起作用。

我已经检测到onStartCommand正在使用媒体按钮意图调用它,但是调用MediaButtonReceiver.handleIntent(mediaSession, intent)结果没有发生任何事情。我的注册MediaCallback永远不会被调用。

我已经为此阅读了文档,观看了 Google 的 youtube 系列,将其与一些演示应用程序进行了比较,并浏览了 StackOverflow,到目前为止,我一直无法找到任何适用于我的应用程序的解决方案。

我可以将媒体回调按钮换成通知上的自定义按钮,但我宁愿不这样做,我更愿意让它与 MediaSession 一起工作,这样我就可以获得手表、自动和锁屏集成。

这就是我的服务:

这是它的清单部分:

我的最低版本是 23,所以我实际上不需要包含一些代码,但我已经测试过,它似乎没有任何区别。

MediaCallback设计为可重用,它的来源:

NotificationFactory 的来源如下:

PlaybackInteractorListenPresenter是架构的表示层,因此它们通过事件总线与更广泛的系统进行通信。我将对它们进行总结,但除非有必要,否则我会避免发布源代码,因为这篇文章已经足够大了。

ListenPresenter当点击/需要播放、停止或终止时被告知,并将这些指令发布到事件总线上,它还从总线读取当前播放状态并通知视图更新(在这种情况下,服务更新通知)。此演示者的另一个实例连接到主屏幕上的按钮。

PlaybackInteractor侦听开始、停止和终止事件,并调用 Player 对象的包装类要求。当播放器通过状态更改进行回调时,它会更新事件总线上的播放状态。dismiss当需要终止时,它还会调用服务。

我在这个应用程序中没有 MediaBrowser 服务,因为我只有一个流,所以没有什么可以浏览的,据我了解 BrowserService 是可选的。

您可以在此问题上提供的任何帮助将不胜感激,我一直在尝试自己解决此问题,但除了死胡同外什么都没碰到,所以我希望有更多媒体框架经验的人可以摆脱一些对此事轻描淡写。

0 投票
2 回答
9759 浏览

android - 无法解析符号“MediaSessionCompat”

我无法导入MediaSessionCompat. 用于导入整个android.support.v4.media库的 import 语句不会显示在 Android Studio“IntelliSense”中,并且它无法解析其中任何内容的符号。

我是否必须进行某种额外的配置才能获得此导入,例如在 app 中build.gradle

0 投票
0 回答
102 浏览

android - 通知中的 MediaButton:单击时出错

我无法使通知的媒体按钮工作。单击播放时出现此错误:

这是我的通知类(你可以看到我使用了 buildMediaButtonPendingIntent 方法):

在我的 android 清单中:

我不知道为什么当我按下媒体按钮时会调用我的 MusicPlayer 的 onBind 方法!谢谢 !

0 投票
2 回答
1085 浏览

android - 拔下耳机时暂停 ExoPlayer

触发广播接收器时如何更改 ExoPlayer 的播放状态?

我有一个 BroadcastReceiver 在耳机断开连接时触发但是我不确定在调用 onReceive() 时处理音频暂停的正确方法。我需要在这里更改 Mediasession 的播放状态吗?

0 投票
1 回答
508 浏览

android - 锁屏控件在小米设备上不起作用

我正在尝试为我的音乐播放器应用程序构建锁屏控件。我已经成功构建了一个带有播放控件的媒体样式通知(完美运行)。小米设备上的锁屏控件始终发送相同的待处理意图 (android.intent.action.MEDIA_BUTTON),而在其他设备中,它完美地触发了预期的意图。

运行在相同代码上的两个设备如何触发两个不同的意图?

通知代码:

分配待处理意图的代码:

MediaSession 的代码:

0 投票
1 回答
1010 浏览

android - E/MediaPlayerNative:媒体会话回调错误 (100, 1)

在我的 android 应用程序中,我创建了一个使用 MediaPlayer 播放远程流的服务。

每次播放流时,应用程序都会显示一条通知。此通知显示一个简单的播放/暂停按钮和其他信息来启动和停止流。

该服务创建通知如下:

为了捕捉通知动作,我使用 MediaSession 回调

服务和接收者注册在 AndroidManifest.xml

问题是:每次我使用通知中的按钮时,应用程序都会停止,显示

日志显示此错误:

在应用程序的其他部分使用此服务可以按预期工作。

我怀疑 MediaButtonReceiver.buildMediaButtonPendingIntent 引起了麻烦。

问题似乎仅限于 android 8 和 8.1,我测试的其他版本(5、6、7.1、9)似乎没有这种奇怪的行为。

在此先感谢您的帮助!

0 投票
1 回答
1293 浏览

android - 无法使用媒体控制器将媒体项目添加到队列

我正在尝试创建一个 Podcast 播放器。所以遵循Android Universal Media Player源代码。我面临的问题是,我不提前知道我的播放列表,而播放列表的创建是在用户交互的基础上进行的。所以我需要从我的活动/片段中添加/删除媒体项目。我的代码与 UMP 示例应用程序非常相似,我还修改了 MusicService 的 mediaSession

我正在尝试将项目添加到队列中,如下所示

但我总是得到这个例外

这里是 addQueueItem 代码表单支持 v4 媒体包

所以,我觉得 getFlags 方法一定有问题,或者我在这里遗漏了一些东西,因为 if 检查总是正确的。

为了重现这个问题,我已经分叉了示例并在应用程序中添加了上述代码。这是完整的代码链接 这是重现的代码