| <?xml version="1.0" encoding="UTF-8"?> |
| <!-- |
| Copyright 2013 The Android Open Source Project |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| <sample> |
| <name>MediaBrowserService</name> |
| <group>Media</group> |
| <package>com.example.android.mediasession</package> |
| |
| <minSdk>19</minSdk> |
| <auto_add_support_lib>true</auto_add_support_lib> |
| <use_java8>true</use_java8> |
| |
| <!-- Include additional dependencies here.--> |
| <dependency>com.android.support:appcompat-v7:26.1.0</dependency> |
| <dependency>com.android.support.constraint:constraint-layout:1.0.2</dependency> |
| |
| <strings> |
| <intro> |
| <![CDATA[ This sample is DEPRECATED. ]]> |
| </intro> |
| </strings> |
| |
| <!-- The basic templates have already been enabled. Uncomment more as desired. --> |
| <template src="base-build" /> |
| <template src="base-application" /> |
| |
| <metadata> |
| <status>DEPRECATED</status> |
| <categories>Media</categories> |
| <technologies>Android</technologies> |
| <languages>Java</languages> |
| <solutions>Mobile</solutions> |
| <level>ADVANCED</level> |
| <icon>screenshots/icon-web.png</icon> |
| <screenshots> |
| <img>screenshots/1-main.png</img> |
| <img>screenshots/2-notification.png</img> |
| </screenshots> |
| <api_refs> |
| <android>android.support.v4.media.MediaBrowserServiceCompat</android> |
| <android>android.support.v4.media.MediaBrowserCompat</android> |
| <android>android.support.v4.media.session.MediaSessionCompat</android> |
| <android>android.support.v4.media.session.MediaControllerCompat</android> |
| <android>android.support.v4.media.app.NotificationCompat.MediaStyle</android> |
| </api_refs> |
| <description> |
| < |
| sample for a more complete solution for using a MediaSession and MediaBrowserService. |
| |
| This sample shows how to implement a media app that allows |
| background playback of audio, and provide a media library |
| that is exposed to other apps. |
| 1. It allows other apps control media playback externally |
| using MediaSession. This allows playback to be controlled by |
| the Google Assistant, for example. |
| 2. It exposes a simple music library through MediaBrowserService. |
| And it provides MediaSession callbacks. This allows it to be used |
| by Android Auto, for example. |
| When not connected to a car, the app has a very simple UI that |
| allows for playback as well as skip to previous and next tracks. |
| To learn more about MediaSession and MediaBrowserService, read |
| this [article on Medium](https://medium.com/google-developers/understanding-mediasession-part-4-4-dcc77c535f99) |
| that goes into the architectural details of these APIs. |
| |
| <img src="screenshots/architecture.png" height="400" alt="Architecture Diagram"/> |
| ]]></description> |
| <intro> |
| <![CDATA[ |
| To implement a MediaBrowserService, you need to: |
| |
| - Extend MediaBrowserServiceCompat, implementing the media |
| browsing related methods onGetRoot and onLoadChildren; |
| |
| - In onCreate, start a new MediaSession and call super.setSessionToken() with |
| this MediaSession's token; |
| |
| - Set a MediaSession.Callback class on the MediaSession. The callback class |
| will receive all the user's actions, like play, pause, etc; |
| |
| - Handle all the actual music playing using any method your app prefers |
| (for example, the Android MediaPlayer class) |
| |
| - Whenever it changes, update info about the playing item and the playing |
| queue using MediaSession corresponding methods (setMetadata, |
| setPlaybackState, setQueue, setQueueTitle, etc) |
| |
| - Handle AudioManager focus change events and react appropriately |
| (e.g. pause when audio focus is lost) |
| |
| |
| To make it compatible with Android Auto, you also need to: |
| |
| - Declare a meta-data tag in AndroidManifest.xml linking to a xml resource |
| with a automotiveApp root element. For a media app, this must include |
| an <uses name="media"/> element as a child. |
| |
| For example, in AndroidManifest.xml: |
| ``` |
| <meta-data android:name="com.google.android.gms.car.application" |
| android:resource="@xml/automotive_app_desc"/> |
| ``` |
| |
| And in res/xml/automotive\_app\_desc.xml: |
| ``` |
| <?xml version="1.0" encoding="utf-8"?> |
| <automotiveApp> |
| <uses name="media"/> |
| </automotiveApp> |
| ``` |
| |
| - Declare and export the service in AndroidManifest.xml: |
| ``` |
| <service |
| android:name=".service.MusicService" |
| android:exported="true"> |
| <intent-filter> |
| <action android:name="android.media.browse.MediaBrowserService" /> |
| </intent-filter> |
| </service> |
| ``` |
| ]]></intro> |
| </metadata> |
| </sample> |