标签: mediabrowserservicecompat

刷新 MediaBrowserService 订阅内容

TL;DR:我已经成功地创建和耦合(通过订阅)一个活动到媒体浏览器服务。此媒体浏览器服务可以继续运行并在后台播放音乐。我希望能够在某个阶段刷新内容,无论是在应用程序再次出现在前台时还是在 SwipeRefreshLayout 事件期间。

我想实现以下功能:

  1. 启动 MediaBrowserServiceCompat 服务。
  2. 从活动中,连接并订阅媒体浏览器服务。
  3. 允许服务在应用程序关闭时继续运行和播放音乐。
  4. 在稍后阶段,或在 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

5
推荐指数
1
解决办法
2018
查看次数

在哪里创建音乐播放器服务wrt MediaBrowserServiceCompat

我想创建一个利用MediaBrowserService功能的MusicPlayer应用程序.在通过MediaBrowserServiceCompat的文档时,我意识到它是Service的子类,这意味着它在Application的主UI线程上运行.

但是,由于音乐播放器是一项长期运行的任务,我认为最好将其作为一个IntentService而不是作为服务来实现.

所以我想问:

  1. 我应该在哪里实现我的MusicPlayer服务?

  2. 我应该在MediaBrowserServiceCompat实施中实施吗?但它不会在UI线程上过重吗?

  3. 或者我应该将其实现为IntentService&从MediaBrowserServiceCompat调用它?但它似乎有点复杂.

这是我的初始代码结构

请建议.

谢谢

java android mediabrowserservicecompat

5
推荐指数
1
解决办法
544
查看次数

在 MediaBrowserService.onLoadChildren 中,何时/如何提供选项包?

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

5
推荐指数
0
解决办法
500
查看次数

使用 ExoPlayer 的 media2 扩展时,如何禁用应用程序的 Android 11 媒体通知?

我有一个使用 ExoPlayer 播放视频的应用程序。PlayerNotificationManager使用 ExoPlayer和来创建通知MediaDescriptionAdapter

在 Pixel 5(但不是 Pixel 3 XL)或任何三星设备上的 Android 11 上,我看到两个通知:一个是我在所有其他操作系统版本上看到的,另一个是出现在Pixel 上的设置托盘或媒体部分中的(和锁定屏幕)在三星设备上。

在某些时候,我想正确支持该通知,但就目前而言,有两个通知是一个错误,而且似乎最简单的修复应该是禁用新通知。

链接的文档说

为了被发现,您的应用程序必须提供 MediaBrowserService,通常使用 Android Jetpack 中的 MediaBrowserServiceCompat 库。

我的应用程序有一个androidx.media2.MediaSessionService,它隐藏了MediaBrowserService. 我尝试null从该onGetSession()方法返回,但通知仍然出现。看来我需要一种方法来完成相当于nullonGetRoot().

我可以做些什么来选择退出此通知,而无需重写所有 MediaSession/MediaSessionService 代码以使用旧的兼容等效项?

android-notifications exoplayer android-mediasession mediabrowserservicecompat

5
推荐指数
0
解决办法
552
查看次数

MediaBrowserServiceCompat中的onGetRoot()和onLoadChildren()的目的是什么?

我在Android的开发初学者试图建立一个媒体播放器的实现MediaBrowserMediaSession

我对onGetRoot()和的功能感到困惑onLoadChildren()

  1. 我的第一个问题是layman's term这两种方法的目的是什么。
  2. 他们所属的根源是onGetRoot()什么?我要记住的是,它是目录的根目录,对吗?
  3. 孩子们属于onLoadChildren()什么?我想的是根目录中的音乐列表,对吗?
  4. 这会onLoadchildren()返回实际的播放列表吗?

android android-mediasession mediabrowserservicecompat

3
推荐指数
1
解决办法
785
查看次数

MediaSession 没有从 MediaStyle Notification 获得任何回调

我创建了一个扩展 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

3
推荐指数
1
解决办法
2493
查看次数

无法使用 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

3
推荐指数
1
解决办法
2611
查看次数

onLoadChildren 在 MediaBrowserServiceCompat 服务上发送 id root 的空列表

每当用户尝试使用我的媒体播放器播放某些曲目时,我就会在某些设备上不断收到此错误。

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)

是什么导致这对某些用户失败而对其他用户有效?

exoplayer mediabrowserservicecompat

2
推荐指数
1
解决办法
1236
查看次数

无法连接 MediaBrowserCompat

我也跟着上连接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)

android mediabrowserservicecompat

1
推荐指数
1
解决办法
1733
查看次数