标签: mediabrowserservice

MediaBrowserService和MediaStore

如何使用MediaBrowserService从不同的提供程序(文件资源管理器,GoogleDrive,ContentProvider等)加载媒体,保持单一服务

经过UAMP检查,它只使用一个提供商

我的第二个问题是onLoadItem的目的是什么

android mediabrowserservice

17
推荐指数
0
解决办法
362
查看次数

如何通过引用Android Auto MediaBrowser在MediaBrowserServiceCompat中设置EXTRA_PAGE和EXTRA_PAGE_SIZE?

我有一个Android Auto应用程序.我想利用分页在应用程序内浏览.您似乎可以通过获取对MediaBrowserCompat的引用并在.subscribe()中传递这些常量来设置EXTRA_PAGE和EXTRA_PAGE_SIZE.但是,我无法弄清楚如何获取Android Auto Audio用于调用.subscribe()的MediaBrowserCompat的引用.

对于一些应该简单的事情来说,这似乎太复杂了,我只是在思考这些事情吗?

pagination android-auto mediabrowserservice mediabrowserservicecompat mediabrowser

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

当我们尝试测试功能时,该应用没有出现在 Android Auto 屏幕中

我在 Playstore 上有一个音频播放器应用程序,想添加对 AndroidAuto 的支持。进行必要的更改后,当我将新的 apk 上传到 Playstore 时,它​​被拒绝并收到了以下来自 Play 的电子邮件

当他们说应用程序没有出现在屏幕上时,这是什么意思?我在清单中有所有必需的条目,使我的服务可以浏览。我不明白缺少什么。

我能够在真正的 android 设备上测试该应用程序,并且它可以正常运行。

---------- 来自 google play 的电子邮件 ----------

应用状态:您的应用尚未被 Android Auto 接受,并且更新未在 Google Play 上发布。

APK 版本的资格问题: 当我们尝试测试功能时,该应用没有出现在自动屏幕中

考虑用于 Android Auto:

  • 对您的应用程序进行必要的更改。
  • 增加升级后的 APK 的版本号。
  • 提交您的应用以供再次审核。

或者,如果您想从 Android Auto 中排除您的应用:

  • 从您的 APK 代码中删除 Android Auto 清单条目。
  • 登录您的 Play 管理中心并上传新的 APK。
  • 单击提交更新。

有关应用如何符合 Android Auto 资格的更多详细信息,您可以查看 Android Auto 应用质量指南。

如果您认为我们做出的此决定有误,请向我们的团队提交其他信息,我们将再次审核您的应用。

感谢您支持 Google Play,

Google Play 团队

android google-play android-auto mediabrowserservice android-automotive

9
推荐指数
0
解决办法
723
查看次数

带有 ExoPlayer 和 PlayerControlView 的 MediaBrowserService - 如何从 UI (PlayerControlView) 访问播放器实例?

我目前正在开发具有视频和音频功能的应用程序的一部分,最近开始重构代码库。目标是集成MediaSession/ MediaControllerMediaBrowserService/ MediaBrowser框架。

我们使用ExoPlayerPlayerControlView更具体的PlayerView的视频和音频组件,它需要提及的播放器实例PlayerControlView

/**
   * Sets the {@link Player} to control.
   *
   * @param player The {@link Player} to control, or {@code null} to detach the current player. Only
   *     players which are accessed on the main thread are supported ({@code
   *     player.getApplicationLooper() == Looper.getMainLooper()}).
   */
  public void setPlayer(@Nullable Player player) {...
Run Code Online (Sandbox Code Playgroud)

但是,在Android开发者职位文档MediaBrowserService,播放器实例应在服务下载。此外,客户端站点(MediaBrowser 和 MediaController)通过connect()方法和MediaBrowserConnectionCallback为其提供服务的唯一方法,这使得将播放器的实例传递给 PlayerControlView(或其他方式)是不可能的。

我曾尝试使用各种回调,例如 …

android exoplayer mediabrowserservice mediabrowserservicecompat mediasession

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

是否可以连接到 Spotify 的 MediaBrowserService?

我正在编写语音助手,希望能够在 Spotify 中启动搜索结果。为了了解如何连接到 Spotify 和其他应用程序,我正在使用Google 的媒体控制器测试应用程序,它被描述为执行以下操作:

创建一个连接到 MediaBrowserService 的简单 MediaController 以测试应用间媒体控件。

此应用程序可与通用 Android 音乐播放器示例或任何其他实现媒体 API 的应用程序配合使用。

当我运行该应用程序时,它将 Spotify 标识为提供MediaBrowserService,但是当我尝试通过该应用程序连接到 Spotify 时出现错误:

包含错误的 Android 屏幕截图:“Spotify 的 MediaBrowser 连接失败”

这是连接代码

mBrowser = new MediaBrowserCompat(this, mMediaAppDetails.componentName,
        new MediaBrowserCompat.ConnectionCallback() {
             @Override
             public void onConnected() {
                 setupMediaController();
                 mBrowseMediaItemsAdapter.setRoot(mBrowser.getRoot());
             }

             @Override
             public void onConnectionSuspended() {
                 //TODO(rasekh): shut down browser.
                 mBrowseMediaItemsAdapter.setRoot(null);
             }

             @Override
             public void onConnectionFailed() {
                 showToastAndFinish(getString(
                         R.string.connection_failed_msg, mMediaAppDetails.appName));
             }

         }, null);
mBrowser.connect();
Run Code Online (Sandbox Code Playgroud)

具体来说,在调用之后不久mBrowser.connect(),回调的onConnectionFailed()方法被调用。

这是否意味着Spotify的拒绝MediaBrowserService来自非白名单中的应用程序请求(如描述在这里),并有没有办法让一个单独的应用程序的作家连接到Spotify的MediaBrowserService,或者是有一些其他的方式来连接?FWIW,Google Play …

android spotify android-service google-music mediabrowserservice

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

Android 助手 - MediaBrowserService - 语音命令 - “在 appName 上播放 x”

语音命令 Play [song] on [my appName] 命令不起作用,“appName”未被谷歌助手识别。

我按照说明表格https://developer.android.com/guide/topics/media-apps/interacting-with-assistant和演示应用表格https://github.com/android/uamp

我的AndroidManifest:

    <application
android:name=".XApplication"
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" // app_name = appX 101.1
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="false"
android:theme="@style/AppTheme">

     <activity
        android:name=".ui.splash.SplashActivity"
        android:exported="true"
        android:launchMode="singleTop"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme.AppFullScreenTheme"
        android:windowSoftInputMode="adjustPan|stateHidden">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
...
...
    <service
        android:name="com.music.android.xx.media.MusicService"
        android:enabled="true"
        android:exported="true"
        tools:ignore="ExportedService">
        <intent-filter>
            <action android:name="android.media.browse.MediaBrowserService" />
        </intent-filter>
    </service>
<service
    android:name=".service.LocationUpdatesService"
    android:foregroundServiceType="location" />

<receiver android:name=".service.StopServiceReceiver" />
<receiver android:name=".service.PlayRadioReceiver" />

<service
    android:name=".service.MyFirebaseService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter> …
Run Code Online (Sandbox Code Playgroud)

android assistant mediabrowserservice mediabrowserservicecompat

6
推荐指数
0
解决办法
641
查看次数

刷新 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
查看次数

如何停止 MediaBrowserServiceCompat?

我的服务:

public class MusicService extends MediaBrowserServiceCompat {
...
}
Run Code Online (Sandbox Code Playgroud)

我的活动:

public class MediaActivity extends AppCompatActivity{
private MediaBrowserCompat mMediaBrowser;
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mMediaBrowser = new MediaBrowserCompat(this,
                new ComponentName(this, MusicService.class), mConnectionCallback, null);
        mMediaBrowser.connect();
}

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMediaBrowser.disconnect();
    }
Run Code Online (Sandbox Code Playgroud)

我想在 UI 中添加关闭按钮,但如何停止MusicService?它继续在后台进行投射。

android android-mediaplayer mediabrowserservice mediabrowserservicecompat mediabrowser

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

在 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
查看次数

泄漏金丝雀检测 MediaBrowserServiceCompat 示例应用程序中的内存泄漏

我创建了一个实现 MediaBrowserServiceCompat 的测试应用程序。我已遵循本指南:\n https://developer.android.com/guide/topics/media-apps/audio-app/building-a-mediabrowserservice \n创建了 MediaPlaybackService 和 MainActivity。我添加了泄漏金丝雀,并在 onDestroy 方法中添加了 AppWatcher.objectWatcher.watch(this) 。打开和退出应用程序时,leak canary 会发现泄漏:

\n\n
6153 bytes retained\n    \xe2\x94\xac\n    \xe2\x94\x9c\xe2\x94\x80 android.service.media.MediaBrowserService$ServiceBinder\n    \xe2\x94\x82    Leaking: UNKNOWN\n    \xe2\x94\x82    GC Root: Global variable in native code\n    \xe2\x94\x82    \xe2\x86\x93 MediaBrowserService$ServiceBinder.this$0\n    \xe2\x94\x82                                        ~~~~~~\n    \xe2\x94\x9c\xe2\x94\x80 androidx.media.MediaBrowserServiceCompat$MediaBrowserServiceImplApi26$MediaBrowserServiceApi26\n    \xe2\x94\x82    Leaking: UNKNOWN\n    \xe2\x94\x82    MediaBrowserServiceCompat$MediaBrowserServiceImplApi26$MediaBrowserServiceApi26 does not wrap an activity context\n    \xe2\x94\x82    \xe2\x86\x93 MediaBrowserServiceCompat$MediaBrowserServiceImplApi26$MediaBrowserServiceApi26.mBase\n    \xe2\x94\x82                                                                                      ~~~~~\n    \xe2\x95\xb0\xe2\x86\x92 com.example.mediabrowsertestapp.MediaPlaybackService\n    \xe2\x80\x8b     Leaking: YES (ObjectWatcher was watching this)\n    \xe2\x80\x8b     MediaPlaybackService does not wrap an activity context\n    \xe2\x80\x8b     key = 11f40383-1498-4743-9f20-208cbd2839a1\n    \xe2\x80\x8b     watchDurationMillis = 5191\n …
Run Code Online (Sandbox Code Playgroud)

android memory-leaks android-service leakcanary mediabrowserservice

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

Android Auto:如何在 MediaBrowserService 的 loadChildren() 上返回大量子项?

我目前正在尝试实现一个MediaBrowserService为 Android Auto 构建媒体应用程序的方法。我按照Android Auto官方文档(https://developer.android.com/training/cars/media#onLoadChildren)来实现该onLoadChildren功能。

以下是我尝试在 Android Auto 屏幕上显示内容的代码片段:

override fun onLoadChildren(parentId: String, result: Result<MutableList<MediaBrowserCompat.MediaItem>>) {
  ...
  if (parentId == NODE_LIBRARY_ALBUMS) {
    val items = mutableListOf<MediaBrowserCompat.MediaItem>()

    val albumList = LibraryManager.getAlbumList()
    for (it in albumList) {
      val descriptionBuilder = MediaDescriptionCompat.Builder()
        .setTitle(it.albumName)
      items.add(MediaBrowserCompat.MediaItem(descriptionBuilder.build(), MediaBrowserCompat.MediaItem.FLAG_BROWSABLE))
    }

    result.sendResult(items)
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

当项目数量足够小时,这种方法效果很好。但是,当项目数量较大时(例如大约5000个项目),会出现以下错误:

E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!  (parcel size = 1339384)
Run Code Online (Sandbox Code Playgroud)

我发现其他几个支持 Android Auto 的媒体应用程序(例如三星音乐)可以显示大量项目。有什么方法可以在函数上返回大量项目onLoadChildren,或者有其他方法可以解决这个问题吗?

谢谢!

android android-auto mediabrowserservice

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

我对 Android Auto 媒体持续时间功能有疑问

我刚刚开发了带有 Android 汽车支持的媒体应用程序,一切工作正常,但我对汽车操作系统的新设计有一个问题,就像以前的设计一样,媒体流没有持续时间,但现在他们增加了媒体的持续时间,我不想要它我想隐藏它,因为我正在播放直播。如果它无法隐藏,那么我想做计数计时器,但我不知道如何使用媒体会话来做到这一点。

这是我设置媒体会话的代码。

mediaSession.setMetadata(new MediaMetadata.Builder()
                .putString(MediaMetadata.METADATA_KEY_ARTIST, "title")
                .putString(MediaMetadata.METADATA_KEY_TITLE, "genre")
                .putLong(MediaMetadata.METADATA_KEY_DURATION, 0)
                .putString(MediaMetadata.METADATA_KEY_ALBUM_ART_URI, "https://homepages.cae.wisc.edu/~ece533/images/peppers.png")
                .build());
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

android android-auto mediabrowserservice android-automotive

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

MediaBrowser 未连接到 MediaBrowserService

我正在尝试使用 MediaBrowser 从活动连接到 MediaBrowserService。但是,我的onConnected回调似乎从未被调用以允许我设置MediaController并开始操作播放。

在我的播放器/浏览器活动中:

private final MediaBrowserCompat.ConnectionCallback mConnectionCallback =
            new MediaBrowserCompat.ConnectionCallback() {
                @Override
                public void onConnected() {
                    try {
                        mMediaController =
                                new MediaControllerCompat(
                                        PlayActivity.this,
                                        mMediaBrowser.getSessionToken()
                                );

                        mMediaController.registerCallback(mControllerCallback);

                        mControllerCallback
                                .onMetadataChanged(mMediaController.getMetadata());
                        mControllerCallback
                                .onPlaybackStateChanged(mMediaController.getPlaybackState());
                    } catch (RemoteException e) {
                        throw new RuntimeException(e);
                    }

                    mMediaController
                            .getTransportControls()
                            .prepareFromUri(
                                    Uri.parse(
                                            getIntent()
                                                    .getStringExtra(StreamingService.STREAM_URI)),
                                    getIntent().getExtras());

                    mMediaController
                            .getTransportControls().play();

                    buildTransportControls();
                }

                @Override
                public void onConnectionSuspended() { }

                @Override
                public void onConnectionFailed() { }
            };

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_play);
        setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
        Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); …
Run Code Online (Sandbox Code Playgroud)

android android-activity foreground-service mediabrowserservice mediabrowser

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