Antoine Danois
Android Developer
@CANALTechTeam
@antoinedroid
Android Auto, keskecé
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
Un peu d’histoire
START
CES 2014
6 Janvier 2014
Création de
l’OAA
Open Automotive Alliance
Google I/O 2014
24 Juin 2014
Annonce d’Android Auto
19 Mars 2015
Première
release
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
Open Automotive Alliance
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
Quels sont les services utilisables sur Android Auto ?
Navigation
Communication
Média
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
Pourquoi mettre myCANAL dans une voiture ?
Une nouveau service pour l’utilisateur
Toujours garder un contact avec ses programmes
Contenus appropriés pour le son sans vidéo
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
Design | Listing
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
Design | Player
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
Les guidelines de sécurité
Pas de son au lancement de l’application
Une baisse du son lors d’une interaction vocale
Un nombre d’interaction tactile limité
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
Et la technique dans tout ça ?
Les tests
| Desktop Head Unit (DHU)
| Mettre une voiture dans votre bureau
<sdk>/platform-tools/
./adb forward tcp:5277 tcp:5277
<sdk>/extras/google/auto/
./desktop-head-unit
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
Comment lire des médias sur Android Auto ?
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
Comment lire des médias sur Android Auto ?
<application>
...
<meta-data
android:name="com.google.android.gms.car.application"
android:resource="@xml/automotive_app_desc" />
...
</application>
<automotiveApp>
<uses name="media" />
</automotiveApp>
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
Comment lire des médias sur Android Auto ?
<application>
...
<service
android:name=".services.AutoService"
android:exported="true">
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService"/>
</intent-filter>
</service>
…
</application>
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
Comment lire des médias sur Android Auto ?
@Override
public BrowserRoot onGetRoot(String clientPackageName, int clientUid, Bundle rootHints) {
// Verify that the specified package is allowed to access your
// content! You'll need to write your own logic to do this.
if (!isValid(clientPackageName, clientUid)) {
// If the request comes from an untrusted package, return null.
// No further calls will be made to other media browsing methods.
return null;
}
return new BrowserRoot(MY_MEDIA_ROOT_ID, null);
}
@Override
public void onLoadChildren(@NonNull String parentId,
@NonNull Result<List<MediaBrowserCompat.MediaItem>> result) {
List<MediaBrowserCompat.MediaItem> list = new ArrayList<>();
switch (parentId) {
case MEDIA_ID_ROOT:
//Page d’accueil, chargement des rubriques
break;
case MEDIA_ID_CHANNEL_SPORT:
loadChannels(MEDIA_ID_CHANNEL_SPORT, result);
result.detach();
break;
case MEDIA_ID_CHANNEL_ACTUALITES:
break;
case MEDIA_ID_CHANNEL_DIVERTISSEMENT:
break;
case MEDIA_ID_CHANNEL_MUSIQUE:
break;
case MEDIA_ID_ALL_CHANNEL:
break;
}
}
new MediaMetadataCompat.Builder()
.putString(MediaMetadata.METADATA_KEY_MEDIA_ID, program.getId)
.putString(MediaMetadata.METADATA_KEY_ALBUM_ART, program.getImage())
.putString(MediaMetadata.METADATA_KEY_TITLE, program.title)
.putString(MediaMetadata.METADATA_KEY_ARTIST, program.subTitle)
.putString(MediaMetadata.METADATA_KEY_ART_URI, channel.LogoUrl)
.putString(MediaMetadata.METADATA_KEY_GENRE, channel.Them)
.putLong(MediaMetadata.METADATA_KEY_NUM_TRACKS, mRadio.size())
.build()
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
MediaSession
private final MediaSessionHelper.Listener mMediaSessionHelperListener = new MediaSessionHelper.Listener() {
@Override
public void onPlayFromMediaId(String mediaId, Bundle extras) {
// Lecture du contenu depuis la liste
}
@Override
public void onPlayFromSearch(String query, Bundle extras) {
// Lecture d’un contenu depuis la recherche vocale
}
@Override
public void onSeekTo(long pos) {}
@Override
public void onPlay() {}
@Override
public void onPause() {}
@Override
public void onStop() {}
@Override
public void onSkipToNext() {}
@Override
public void onSkipToPrevious() {}
};
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
AudioManager
mAudioFocus = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_LOSS:
// Lost audio focus, probably "permanently"
stopAndReleasePlayer();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
getPlayer().setVolume(VOLUME_DUCK);
break;
case AudioManager.AUDIOFOCUS_GAIN:
case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:
getPlayer().setVolume(VOLUME_NORMAL);
break;
}
}
};
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
La puissance d’Exoplayer
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
Statistiques | CNEWS
Utilisateurs Android Auto par jour sur CNEWS
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
Retour d’expérience
Android Auto, vos médias dans votre voiture
Antoine Danois | @antoinedroid | #AndroidAutoCanal
Conclusion
Antoine Danois | @antoinedroid
CANAL+ | @CANALTechTeam
We’re hiring !