如何使用MediaBrowserService从不同的提供程序(文件资源管理器,GoogleDrive,ContentProvider等)加载媒体,保持单一服务
经过UAMP检查,它只使用一个提供商
我的第二个问题是onLoadItem的目的是什么
我有一个Android Auto应用程序.我想利用分页在应用程序内浏览.您似乎可以通过获取对MediaBrowserCompat的引用并在.subscribe()中传递这些常量来设置EXTRA_PAGE和EXTRA_PAGE_SIZE.但是,我无法弄清楚如何获取Android Auto Audio用于调用.subscribe()的MediaBrowserCompat的引用.
对于一些应该简单的事情来说,这似乎太复杂了,我只是在思考这些事情吗?
pagination android-auto mediabrowserservice mediabrowserservicecompat mediabrowser
我在 Playstore 上有一个音频播放器应用程序,想添加对 AndroidAuto 的支持。进行必要的更改后,当我将新的 apk 上传到 Playstore 时,它被拒绝并收到了以下来自 Play 的电子邮件
当他们说应用程序没有出现在屏幕上时,这是什么意思?我在清单中有所有必需的条目,使我的服务可以浏览。我不明白缺少什么。
我能够在真正的 android 设备上测试该应用程序,并且它可以正常运行。
---------- 来自 google play 的电子邮件 ----------
应用状态:您的应用尚未被 Android Auto 接受,并且更新未在 Google Play 上发布。
APK 版本的资格问题: 当我们尝试测试功能时,该应用没有出现在自动屏幕中。
考虑用于 Android Auto:
或者,如果您想从 Android Auto 中排除您的应用:
有关应用如何符合 Android Auto 资格的更多详细信息,您可以查看 Android Auto 应用质量指南。
如果您认为我们做出的此决定有误,请向我们的团队提交其他信息,我们将再次审核您的应用。
感谢您支持 Google Play,
Google Play 团队
android google-play android-auto mediabrowserservice android-automotive
我目前正在开发具有视频和音频功能的应用程序的一部分,最近开始重构代码库。目标是集成MediaSession/ MediaController和MediaBrowserService/ MediaBrowser框架。
我们使用ExoPlayer和PlayerControlView更具体的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
我正在编写语音助手,希望能够在 Spotify 中启动搜索结果。为了了解如何连接到 Spotify 和其他应用程序,我正在使用Google 的媒体控制器测试应用程序,它被描述为执行以下操作:
创建一个连接到 MediaBrowserService 的简单 MediaController 以测试应用间媒体控件。
此应用程序可与通用 Android 音乐播放器示例或任何其他实现媒体 API 的应用程序配合使用。
当我运行该应用程序时,它将 Spotify 标识为提供MediaBrowserService,但是当我尝试通过该应用程序连接到 Spotify 时出现错误:
这是连接代码:
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
语音命令 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
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
我的服务:
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
在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
我创建了一个实现 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\n6153 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
我目前正在尝试实现一个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 汽车支持的媒体应用程序,一切工作正常,但我对汽车操作系统的新设计有一个问题,就像以前的设计一样,媒体流没有持续时间,但现在他们增加了媒体的持续时间,我不想要它我想隐藏它,因为我正在播放直播。如果它无法隐藏,那么我想做计数计时器,但我不知道如何使用媒体会话来做到这一点。
这是我设置媒体会话的代码。
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)
我正在尝试使用 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
android ×12
android-auto ×4
mediabrowser ×4
assistant ×1
exoplayer ×1
google-music ×1
google-play ×1
kotlin ×1
leakcanary ×1
mediasession ×1
memory-leaks ×1
pagination ×1
spotify ×1