TL;DR:我已经成功地创建和耦合(通过订阅)一个活动到媒体浏览器服务。此媒体浏览器服务可以继续运行并在后台播放音乐。我希望能够在某个阶段刷新内容,无论是在应用程序再次出现在前台时还是在 SwipeRefreshLayout 事件期间。
我想实现以下功能:
我收到的问题是在 MediaBrowserService 中(在创建订阅后)您只能从 onLoadChildren() 方法调用 sendResult() 一次,因此下次尝试使用相同的根订阅媒体浏览器服务时,第二次调用 sendResult() 时会出现以下异常:
E/UncaughtException: java.lang.IllegalStateException: sendResult() called when either sendResult() or sendError() had already been called for: MEDIA_ID_ROOT
at android.support.v4.media.MediaBrowserServiceCompat$Result.sendResult(MediaBrowserServiceCompat.java:602)
at com.roostermornings.android.service.MediaService.loadChildrenImpl(MediaService.kt:422)
at com.roostermornings.android.service.MediaService.access$loadChildrenImpl(MediaService.kt:50)
at com.roostermornings.android.service.MediaService$onLoadChildren$1$onSyncFinished$playerEventListener$1.onPlayerStateChanged(MediaService.kt:376)
at com.google.android.exoplayer2.ExoPlayerImpl.handleEvent(ExoPlayerImpl.java:422)
at com.google.android.exoplayer2.ExoPlayerImpl$1.handleMessage(ExoPlayerImpl.java:103)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:5665)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:822)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:712)
Run Code Online (Sandbox Code Playgroud)
我调用以下方法来连接和断开媒体浏览器(同样,第一次连接时一切运行顺利,但在第二次连接时,我不确定如何通过订阅刷新内容):
override fun onStart() {
super.onStart()
mMediaBrowser = MediaBrowserCompat(this, ComponentName(this, MediaService::class.java), connectionCallback, null)
if (!mMediaBrowser.isConnected)
mMediaBrowser.connect()
}
override …Run Code Online (Sandbox Code Playgroud) android kotlin android-mediasession mediabrowserservice mediabrowserservicecompat
我想创建一个利用MediaBrowserService功能的MusicPlayer应用程序.在通过MediaBrowserServiceCompat的文档时,我意识到它是Service的子类,这意味着它在Application的主UI线程上运行.
但是,由于音乐播放器是一项长期运行的任务,我认为最好将其作为一个IntentService而不是作为服务来实现.
所以我想问:
我应该在哪里实现我的MusicPlayer服务?
我应该在MediaBrowserServiceCompat实施中实施吗?但它不会在UI线程上过重吗?
或者我应该将其实现为IntentService&从MediaBrowserServiceCompat调用它?但它似乎有点复杂.
这是我的初始代码结构
请建议.
谢谢
在MediaServiceBrowseror中MediaServiceBrowserCompat,有两种方法:
public abstract void onLoadChildren (String parentId,
Result<List<MediaBrowser.MediaItem>> result)
和
public void onLoadChildren (String parentId,
Result<List<MediaBrowser.MediaItem>> result,
Bundle options)
options描述为:
Bundle:从媒体浏览器发送的特定于服务的参数包。通过结果返回的信息应该受到该包内容的影响。该值绝不能为空。
我希望向(正在加载其子级的)MediaDescriptionCompat提供额外的内容,以便在第二次调用中将它们呈现出来。MediaItem
但是,仅调用第一个方法,如在 Android Auto 下测试的那样。
我需要做什么才能因options争论而被叫去?
android mediabrowserservice mediabrowserservicecompat mediabrowser
我有一个使用 ExoPlayer 播放视频的应用程序。PlayerNotificationManager使用 ExoPlayer和来创建通知MediaDescriptionAdapter。
在 Pixel 5(但不是 Pixel 3 XL)或任何三星设备上的 Android 11 上,我看到两个通知:一个是我在所有其他操作系统版本上看到的,另一个是出现在Pixel 上的设置托盘或媒体部分中的(和锁定屏幕)在三星设备上。
在某些时候,我想正确支持该通知,但就目前而言,有两个通知是一个错误,而且似乎最简单的修复应该是禁用新通知。
链接的文档说
为了被发现,您的应用程序必须提供 MediaBrowserService,通常使用 Android Jetpack 中的 MediaBrowserServiceCompat 库。
我的应用程序有一个androidx.media2.MediaSessionService,它隐藏了MediaBrowserService. 我尝试null从该onGetSession()方法返回,但通知仍然出现。看来我需要一种方法来完成相当于null从onGetRoot().
我可以做些什么来选择退出此通知,而无需重写所有 MediaSession/MediaSessionService 代码以使用旧的兼容等效项?
android-notifications exoplayer android-mediasession mediabrowserservicecompat
我在Android的开发初学者试图建立一个媒体播放器的实现MediaBrowser和MediaSession。
我对onGetRoot()和的功能感到困惑onLoadChildren()。
layman's term这两种方法的目的是什么。 onGetRoot()什么?我要记住的是,它是目录的根目录,对吗?onLoadChildren()什么?我想的是根目录中的音乐列表,对吗?onLoadchildren()返回实际的播放列表吗?我创建了一个扩展 MediaBrowserServiceCompat 的服务。该服务持有对我的播放器的引用并创建一个带有回调的新 MediaSession。每次播放器更改状态时,我都会更新 MediaSession 的播放状态并创建一个 MediaStyle 通知。当我开始在播放器中播放某些内容时会显示通知,但通知中的按钮没有触发 MediaSession 回调,它们不执行任何操作。我在 MediaSession 中设置了正确的标志,我将会话设置为活动状态,我在播放状态中设置了正确的操作,我正在将会话令牌传递给通知,但仍然没有从中获得任何回调. 我真的不知道我做错了什么。所有这些代码都在我的应用程序导入的模块中。
我的 NotificationHelper 类:
private final MusicService mService;
private final NotificationCompat.Action mPlayAction;
private final NotificationCompat.Action mPauseAction;
private final NotificationCompat.Action mNextAction;
private final NotificationCompat.Action mPrevAction;
private final NotificationManager mNotificationManager;
public MediaNotificationManager(MusicService service) {
mService = service;
mNotificationManager =
(NotificationManager) mService.getSystemService(Context.NOTIFICATION_SERVICE);
mPlayAction =
new NotificationCompat.Action(
R.drawable.exo_icon_play,
"Play",
MediaButtonReceiver.buildMediaButtonPendingIntent(
mService,
PlaybackStateCompat.ACTION_PLAY));
mPauseAction =
new NotificationCompat.Action(
R.drawable.exo_icon_pause,
"Pause",
MediaButtonReceiver.buildMediaButtonPendingIntent(
mService,
PlaybackStateCompat.ACTION_PAUSE));
mNextAction =
new NotificationCompat.Action(
R.drawable.exo_icon_next,
"Next",
MediaButtonReceiver.buildMediaButtonPendingIntent(
mService,
PlaybackStateCompat.ACTION_SKIP_TO_NEXT));
mPrevAction = …Run Code Online (Sandbox Code Playgroud) android android-notifications android-mediasession mediabrowserservicecompat
我是安卓开发新手。我想创建一个以客户端-服务器方式运行的音乐播放器。我现在正在尝试创建服务器部分。我发现我可以使用官方文档中的说明来实现此MediaBrowserServiceCompat目的。但是当我尝试在我的项目中使用它时,它说Unresolved reference: MediaBrowserServiceCompat
虽然我已经将 Android Studio 设置为自动导入所需的库,但我尝试显式导入android.support.v4.*, android.support.*, androidx.*,希望它可以工作,但事实证明它没有。因此,我前往UAMP(通用 Android 音乐播放器)的 GitHub 存储库寻求帮助。import androidx.media.MediaBrowserServiceCompat我在这个文件中找到了这个声明。但我找不到任何这样命名的库
为什么我的清单这么说MediaPlaybackService must extend android.app.service?
我应该如何使用它?谢谢!
编辑:我做了一些研究和修补。我尝试更改清单中的服务名称和关联的类名称,并且MyMediaBrowserServiceCompat神奇地它起作用了(有点)。所以现在,我的问题是,这是正常行为吗?更改服务名称真的会影响这种情况吗?如果是这样,它究竟如何在其他人的机器上使用不同的名称(与类名本身不相似的东西)工作?其次,现在我的代码说There's a cycle in the inheritance hierarchy for this type
我在网上搜索并找到了这个。所以我知道该消息的含义,但我不知道在这种情况下如何解决它。我的清单仍然这么说:MyMediaBrowserServiceCompat must extend android.app.service
android android-service kotlin android-mediasession mediabrowserservicecompat
每当用户尝试使用我的媒体播放器播放某些曲目时,我就会在某些设备上不断收到此错误。
Fatal Exception: java.lang.IllegalStateException: onLoadChildren sent null list for id root
at android.service.media.MediaBrowserService$3.onResultSent(MediaBrowserService.java:473)
at android.service.media.MediaBrowserService$3.onResultSent(MediaBrowserService.java:469)
at android.service.media.MediaBrowserService$Result.sendResult(MediaBrowserService.java:131)
at android.support.v4.media.MediaBrowserServiceCompatApi21$ResultWrapper.sendResult(MediaBrowserServiceCompatApi21.java:77)
at android.support.v4.media.MediaBrowserServiceCompat$MediaBrowserServiceImplApi21$3.onResultSent(MediaBrowserServiceCompat.java:366)
at android.support.v4.media.MediaBrowserServiceCompat$MediaBrowserServiceImplApi21$3.onResultSent(MediaBrowserServiceCompat.java:354)
at android.support.v4.media.MediaBrowserServiceCompat$Result.sendResult(MediaBrowserServiceCompat.java:606)
at com.radioafrica.music.playback.MusicPlaybackService.onLoadChildren(MusicPlaybackService.java:102)
at android.support.v4.media.MediaBrowserServiceCompat$MediaBrowserServiceImplApi21.onLoadChildren(MediaBrowserServiceCompat.java:374)
at android.support.v4.media.MediaBrowserServiceCompatApi21$MediaBrowserServiceAdaptor.onLoadChildren(MediaBrowserServiceCompatApi21.java:128)
at android.service.media.MediaBrowserService.performLoadChildren(MediaBrowserService.java:495)
at android.service.media.MediaBrowserService.addSubscription(MediaBrowserService.java:459)
at android.service.media.MediaBrowserService.access$400(MediaBrowserService.java:68)
at android.service.media.MediaBrowserService$ServiceBinder$3.run(MediaBrowserService.java:247)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7325)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Run Code Online (Sandbox Code Playgroud)
我的方法代码onLoadChildren是:
@Override
public void onLoadChildren(@NonNull String s, @NonNull Result<List<MediaBrowserCompat.MediaItem>> result) {
result.sendResult(null);
}
Run Code Online (Sandbox Code Playgroud)
是什么导致这对某些用户失败而对其他用户有效?
我也跟着上连接MediaBrowserCompat Android的正式文件,但它拒绝连接,因为事实上没有onConnected(),onConnectionSuspended()或者onConnectionFailed()被调用。
我也试过这个答案,但没有用。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_audio_player);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setupMediaComponents();
// initializeViews();
}
private void setupMediaComponents() {
Log.d(TAG, "setupMediaComponents");
setVolumeControlStream(AudioManager.STREAM_MUSIC);
mediaBrowserCompat = new MediaBrowserCompat(this, new ComponentName(this, SongPlayerService.class),
mediaBrowserCompatConnectionCallback, null);
}
@Override
protected void onStart() {
super.onStart();
mediaBrowserCompat.connect();
}
@Override
public void onStop() {
super.onStop();
// (see "stay in sync with the MediaSession")
if (MediaControllerCompat.getMediaController(this) != null) {
MediaControllerCompat.getMediaController(this).unregisterCallback(controllerCallback);
}
mediaBrowserCompat.disconnect();
}
private MediaBrowserCompat.ConnectionCallback mediaBrowserCompatConnectionCallback = …Run Code Online (Sandbox Code Playgroud)