首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过引用Android Auto MediaBrowser来设置MediaBrowserServiceCompat中的EXTRA_PAGE和EXTRA_PAGE_SIZE?

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

Stack Overflow用户
提问于 2017-07-11 15:21:01
回答 2查看 744关注 0票数 12

我有一个Android汽车应用程序。我想利用分页的优势在应用程序内浏览。似乎可以通过获取对MediaBrowserCompat的引用并在.subscribe()中传递这些常量来设置EXTRA_PAGE和EXTRA_PAGE_SIZE。但是,我不知道如何获得对Android Auto Audio调用.subscribe()所使用的MediaBrowserCompat的引用。

对于本应简单的事情来说,这似乎太复杂了,我是不是想多了?

EN

回答 2

Stack Overflow用户

发布于 2018-06-13 22:08:23

如何获取Android Auto MediaBrowser的参考?对于它,您应该知道包名和类名(如果您试图在应用程序外部绑定它)。如果你不知道这些细节,你可以直接从包管理器那里获取。

代码语言:javascript
复制
final Intent providerIntent = 
new Intent(MediaBrowserService.SERVICE_INTERFACE);
List<ResolveInfo> mediaApps = 
    mPackageManager.queryIntentServices(providerIntent, 0);
for (ResolveInfo info : mediaApps) {
    new MediaBrowserCompat(context, 
        new ComponentName(info.serviceInfo.packageName, 
        info.serviceInfo.name), mConnectionCallbacks, null);
}

如何设置EXTRA_PAGE和EXTRA_PAGE_SIZE?

代码语言:javascript
复制
Bundle bundle = new Bundle();
bundle.putInt(MediaBrowserCompat.EXTRA_PAGE, 1);
bundle.putInt(MediaBrowserCompat.EXTRA_PAGE_SIZE, 1);
mBrowser.subscribe("__SOME_ID__", bundle, callback);

如果在服务端使用包覆盖onLoadChildren(),那么还必须处理分页逻辑。你可以绕过它,只需覆盖onLoadChildren而不使用包。

票数 1
EN

Stack Overflow用户

发布于 2017-07-29 12:11:26

请注意:通常在Android中,当你在末尾看到compat后缀时,它是一个没有compat的新(增强)版本。

MediaActivity不是特别的活动,它是一种活动,是为了演奏音乐而设计的。正如您向MediaBrowserCompat和MediaBrowserServiceCompat询问的那样,我将我的默认体系结构(下面给出的体系结构2)更改为体系结构1(下面给出的体系结构1是在版本22中新引入的),只是为了给出您所问的确切答案。

的两种架构是:

Architecture1)

1) MediaActivity <--uses----> MediaBrowserCompat <---uses--> MediaServiceBrowserCompat <----> MediaSessionCompat <---> MediaSession <--pass session token --> MediaControllerCompat <-- it also passes token to create --> MediaController /* latest API introduced in 22 */

2)

代码语言:javascript
复制
 <service android:name=".MyMediaBrowserServiceCompat"
              android:label="@string/service_name" >
         <intent-filter>
             <action android:name="android.media.browse.MediaBrowserService" />
         </intent-filter>
     </service>

3) Uses MediaSessionCompat to control music playing.

4) Once a session is created the owner of the session may pass its session token to other processes to allow them to create a MediaControllerCompat to interact with the session.

5) A MediaController can be created if you have a MediaSessionCompat.Token from the session owner.

现在,您创建了MediaController

从这里开始,这两个架构都做了同样的事情。

Architecture2)

1)MediaActivity <--uses----> MediaBrowser <---uses--> MediaServiceBrowser /* old one introduced in 21. This is default */

2)

代码语言:javascript
复制
 <service android:name=".MyMediaBrowserService"
          android:label="@string/service_name" >
     <intent-filter>
         <action android:name="android.media.browse.MediaBrowserService" />
     </intent-filter>
 </service>

3) Uses MediaSession to control music playing

4) Once a session is created the owner of the session may pass its session token to other processes to allow them to create a MediaController to interact with the session.

5) A MediaController can be created through MediaSessionManager if you hold the "android.permission.MEDIA_CONTENT_CONTROL" permission or are an enabled notification listener or by getting a MediaSession.Token directly from the session owner.

现在,您创建了MediaController

从这里开始,这两个架构都做了同样的事情。

注意:默认情况下,当您创建Android Auto项目时,它仍然使用架构2,但是,我使用架构1是因为您通过MediaBrowserCompat请求这样做。所以,你在这里可能会有点困惑。

因为确切的实现有点长,所以我提供了确切的链接,您可以通过MediaBrowserCompat way (体系结构1) https://github.com/googlesamples/android-MediaBrowserService找到实现

我在这里发布了基于该体系结构的基本代码--因为它是版本22中引入的新代码--只是为了向您展示如何获得MediaBrowserCompat参考。

mConnectionCallbacks是连接MediaServiceBrowserCompat和MediaBrowserCompat的主要技术。MediaBrowserCompat控制由MediaServiceBrowserCompat提供的媒体。适合用于控制媒体的活动称为MediaActivity。MediaActivity使用MediaBrowserCompat来控制媒体(例如,音量、播放更改等)。MediaBrowserCompat设置了mConnectionCallbacks,它进一步提供了onConnected()等方法,您可以在其中放置自己的逻辑。

代码语言:javascript
复制
public class MyMediaActivity /* can be any activity */ extends AppCompatActivity {

private MediaBrowserCompat mMediaBrowserCompat; /* your reference here */

MediaControllerCompat mediaController = MediaControllerCompat.getMediaController(MyMediaActivity.this);
MediaControllerCompat.Callback controllerCallback =
        new MediaControllerCompat.Callback() {
            @Override
            public void onMetadataChanged(MediaMetadataCompat metadata) {
            }

            @Override
            public void onPlaybackStateChanged(PlaybackStateCompat state) {
            }
        };


private MediaBrowserCompat.ConnectionCallback mConnectionCallbacks =
        new MediaBrowserCompat.ConnectionCallback() {
            @Override
            public void onConnected() {

                // Get the token for the MediaSession
                MediaSessionCompat.Token token = mMediaBrowserCompat.getSessionToken();

                // Create a MediaControllerCompat
                MediaControllerCompat mediaController =
                        null;
                try {
                    mediaController = new MediaControllerCompat(MyMediaActivity.this, // Context
                            token);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }

                // Save the controller
                MediaControllerCompat.setMediaController(MyMediaActivity.this, mediaController);

                // Finish building the UI
                buildTransportControls();
            }

            @Override
            public void onConnectionSuspended() {
                // The Service has crashed. Disable transport controls until it automatically reconnects
            }

            @Override
            public void onConnectionFailed() {
                // The Service has refused our connection
            }
        };

void buildTransportControls() {
    /* you can define your view to control music here */
    /* your stuffs here */
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Display the initial state
    MediaMetadataCompat metadata = mediaController.getMetadata();
    PlaybackStateCompat pbState = mediaController.getPlaybackState();

    // Register a Callback to stay in sync
    mediaController.registerCallback(controllerCallback);


    mConnectionCallbacks = new MediaBrowserCompat.ConnectionCallback();

    /* your MediaBrowserCompat instance reference here*/
    mMediaBrowserCompat = new MediaBrowserCompat(this,
            new ComponentName(this, MyMediaBrowserServiceCompat.class),
            mConnectionCallbacks,
            null); // optional Bundle



/* now you can call subscribe() callbacks via mMediaBrowserCompat.subscribe(.....) anywhere inside this Activity's 
            lifecycle callbacks
             */


}

@Override
public void onStart() {
    super.onStart();
    mMediaBrowserCompat.connect();
}

@Override
public void onStop() {
    super.onStop();
    // (see "stay in sync with the MediaSession")
    if (MediaControllerCompat.getMediaController(MyMediaActivity.this) != null) {
        MediaControllerCompat.getMediaController(MyMediaActivity.this).unregisterCallback(controllerCallback);
    }


      mMediaBrowserCompat.disconnect();

    }
}

现在,您可以创建服务注释MediaBrowserServiceCompat is /* */,如下所示。

代码语言:javascript
复制
public class MyMediaBrowserServiceCompat extends MediaBrowserServiceCompat {
/* various calbacks here */
}

有关更多研究,您可以阅读此链接,它准确地解释了我上面提出的逻辑。https://developer.android.com/guide/topics/media-apps/audio-app/building-a-mediabrowser-client.html#connect-ui-and-mediacontroller

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45027916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档