summaryrefslogtreecommitdiff
path: root/MusicDemo/README.txt
blob: 97a506e4388fce946511b96d0d1b2f43f6fa5e27 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Android Automobile sample
=========================


Integration points
------------------

MusicService.java is the main entry point to the integration. It needs to:

    - extend android.service.media.MediaBrowserService, implementing the media browsing related methods onGetRoot and onLoadChildren;
    - start a new MediaSession and notify it's parent of the session's token (super.setSessionToken());
    - set a callback on the MediaSession. The callback 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)
    - update info about the playing item and the playing queue using MediaSession (setMetadata, setPlaybackState, setQueue, setQueueTitle, etc)
    - handle AudioManager focus change events and react appropriately (eg, pause when audio focus is lost)
    - 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/values/automotive_app_desc.xml:
          <?xml version="1.0" encoding="utf-8"?>
          <automotiveApp>
              <uses name="media"/>
          </automotiveApp>

    - be declared in AndroidManifest as an intent receiver for the action android.media.browse.MediaBrowserService:

        <!-- Implement a service  -->
        <service
            android:name=".service.MusicService"
            android:exported="true"
            >
            <intent-filter>
                <action android:name="android.media.browse.MediaBrowserService" />
            </intent-filter>
        </service>


Optionally, you can listen to special intents that notify your app when a car is connected/disconnected. This may be useful if your app has special requirements when running on a car - for example, different media or ads. See CarPlugReceiver for more information.


Customization
-------------

The car media app has only a few customization opportunities. You may:

- Set the background color by using Android L primary color:
    <style name="AppTheme" parent="android:Theme.Material">
        <item name="android:colorPrimary">#ff0000</item>
    </style>

- Add custom actions in the state passed to setPlaybackState(state)

- Handle custom actions in the MediaSession.Callback.onCustomAction



Known issues:
-------------

- Sample: Resuming after pause makes the "Skip to previous" button disappear

- Sample: playFromSearch creates a queue with search results, but then skip to next/previous don't work correctly because the queue is recreated without the search criteria

- Emulator: running menu->search twice throws an exception.

- Emulator: Under some circumstances, stop or onDestroy may never get called on MusicService and the MediaPlayer keeps locking some resources. Then, mediaPlayer.setDataSource on a new MediaPlayer object halts (probably) due to a deadlock. The workaround is to reboot the device.