1 of 21

Antoine Danois

Android Developer

@CANALTechTeam

@antoinedroid

2 of 21

Android Auto, keskecé

Android Auto, vos médias dans votre voiture

Antoine Danois | @antoinedroid | #AndroidAutoCanal

3 of 21

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

4 of 21

Open Automotive Alliance

Android Auto, vos médias dans votre voiture

Antoine Danois | @antoinedroid | #AndroidAutoCanal

5 of 21

Quels sont les services utilisables sur Android Auto ?

Navigation

Communication

Média

Android Auto, vos médias dans votre voiture

Antoine Danois | @antoinedroid | #AndroidAutoCanal

6 of 21

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

7 of 21

Design | Listing

  • Simplifié

  • Classement par ordre alphabétique possible

  • Nombre d’interactions limité

Android Auto, vos médias dans votre voiture

Antoine Danois | @antoinedroid | #AndroidAutoCanal

8 of 21

Design | Player

  • Épuré

  • Configuration limitée

Android Auto, vos médias dans votre voiture

Antoine Danois | @antoinedroid | #AndroidAutoCanal

9 of 21

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

10 of 21

Et la technique dans tout ça ?

11 of 21

Les tests

| Desktop Head Unit (DHU)

| Mettre une voiture dans votre bureau

  • Téléchargement du DHU depuis le SDK Manager

  • Télécharger l’application Android Auto sur votre device

  • Deux commandes ADB et boum

<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

12 of 21

Comment lire des médias sur Android Auto ?

  • MediaPlayer
  • Exoplayer
  • Service
  • Mediasession

Android Auto, vos médias dans votre voiture

Antoine Danois | @antoinedroid | #AndroidAutoCanal

13 of 21

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

14 of 21

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

15 of 21

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

16 of 21

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

17 of 21

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

18 of 21

La puissance d’Exoplayer

  • Pas de plan vidéo (SurfaceView) à gérer

  • Même flux, mais juste en téléchargeant l’audio

Android Auto, vos médias dans votre voiture

Antoine Danois | @antoinedroid | #AndroidAutoCanal

19 of 21

Statistiques | CNEWS

Utilisateurs Android Auto par jour sur CNEWS

Android Auto, vos médias dans votre voiture

Antoine Danois | @antoinedroid | #AndroidAutoCanal

20 of 21

Retour d’expérience

  • Pas de vidéo
  • Guidelines strictes
  • Pas beaucoup de contrôle sur ce qu’on voudrait faire
  • Facile à développer
  • Un nouveau service pour les abonnés myCANAL
  • ASO (App Store Optimization) amélioré

Android Auto, vos médias dans votre voiture

Antoine Danois | @antoinedroid | #AndroidAutoCanal

21 of 21

Conclusion

Antoine Danois | @antoinedroid

CANAL+ | @CANALTechTeam

We’re hiring !