• Home
Name Date Size #Lines LOC

..--

gradle/wrapper/03-May-2024-76

src/main/03-May-2024-2,1771,300

.gitignoreD03-May-202444 65

README.txtD03-May-20243.1 KiB7148

build.gradleD03-May-2024393 2619

gradle.propertiesD03-May-2024853 1814

gradlewD03-May-20245 KiB165122

proguard-project.txtD03-May-2024781 2118

README.txt

1Android Automobile sample
2=========================
3
4
5Integration points
6------------------
7
8MusicService.java is the main entry point to the integration. It needs to:
9
10    - extend android.service.media.MediaBrowserService, implementing the media browsing related methods onGetRoot and onLoadChildren;
11    - start a new MediaSession and notify it's parent of the session's token (super.setSessionToken());
12    - set a callback on the MediaSession. The callback will receive all the user's actions, like play, pause, etc;
13    - handle all the actual music playing using any method your app prefers (for example, the Android MediaPlayer class)
14    - update info about the playing item and the playing queue using MediaSession (setMetadata, setPlaybackState, setQueue, setQueueTitle, etc)
15    - handle AudioManager focus change events and react appropriately (eg, pause when audio focus is lost)
16    - declare a meta-data tag in AndroidManifest.xml linking to a xml resource
17      with a <automotiveApp> root element. For a media app, this must include
18      an <uses name="media"/> element as a child.
19      For example, in AndroidManifest.xml:
20         <meta-data android:name="com.google.android.gms.car.application"
21           android:resource="@xml/automotive_app_desc"/>
22      And in res/values/automotive_app_desc.xml:
23          <?xml version="1.0" encoding="utf-8"?>
24          <automotiveApp>
25              <uses name="media"/>
26          </automotiveApp>
27
28    - be declared in AndroidManifest as an intent receiver for the action android.media.browse.MediaBrowserService:
29
30        <!-- Implement a service  -->
31        <service
32            android:name=".service.MusicService"
33            android:exported="true"
34            >
35            <intent-filter>
36                <action android:name="android.media.browse.MediaBrowserService" />
37            </intent-filter>
38        </service>
39
40
41Optionally, 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.
42
43
44Customization
45-------------
46
47The car media app has only a few customization opportunities. You may:
48
49- Set the background color by using Android L primary color:
50    <style name="AppTheme" parent="android:Theme.Material">
51        <item name="android:colorPrimary">#ff0000</item>
52    </style>
53
54- Add custom actions in the state passed to setPlaybackState(state)
55
56- Handle custom actions in the MediaSession.Callback.onCustomAction
57
58
59
60Known issues:
61-------------
62
63- Sample: Resuming after pause makes the "Skip to previous" button disappear
64
65- 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
66
67- Emulator: running menu->search twice throws an exception.
68
69- 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.
70
71