SlideShare une entreprise Scribd logo
1  sur  43
Télécharger pour lire hors ligne
Android 7.1Quelles sont les nouveautés ?
Edouard MarquezMangueur de nougats et de pommes
Développeur Android Freelance
Organisateur du Paris Android User Group
@g123kL
+EdouardMarquezG
01Des icônes
rondes
Que nous réservera la
prochaine version
d’Android ?
B
01Des icônes rondes
AndroidManifest.xml
<application
android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"
android:roundIcon="@mipmap/ic_icon2">
Mais on peut faire ce que l’on veut
Il est tout à fait possible de donner une image qui n’est pas ronde.
Les launchers ne forcent pas pour le moment la forme ronde.
o
6
01Des icônes rondes
AndroidManifest.xml
<application
android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"
android:roundIcon="@mipmap/ic_icon2">
Mais on peut faire ce que l’on veut
Il est tout à fait possible de donner une image qui n’est pas ronde.
Les launchers ne forcent pas pour le moment la forme ronde.
o
6
02Libérer de l’espace
sur le disque
Nouvel Intent
StorageManager.ACTION_MANAGE_STORAGEo
03Les fonds
d’écran
animés en 

(un peu)
mieux
03Les fonds d’écran animés en (un peu) mieux
Pour rappel, un fond d’écran animé se définit dans l’AndroidManifest :
<service android:label=“@string/name"
android:name=".LWService"
android:permission="android.permission.BIND_WALLPAPER">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data
android:name="android.service.wallpaper"
android:resource="@xml/wallpaper" />
</service>
o
03Les fonds d’écran animés en (un peu) mieux
Pour rappel, un fond d’écran animé se définit dans l’AndroidManifest :
<service android:label=“@string/name"
android:name=".LWService"
android:permission="android.permission.BIND_WALLPAPER">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data
android:name="android.service.wallpaper"
android:resource="@xml/wallpaper" />
</service>
o
Service
Android8
oextends
AndroidLiveWallpaper

Service
03Les fonds d’écran animés en (un peu) mieux
Pour rappel, un fond d’écran animé se définit dans l’AndroidManifest :
<service android:label=“@string/name"
android:name=".LWService"
android:permission="android.permission.BIND_WALLPAPER">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data
android:name="android.service.wallpaper"
android:resource="@xml/wallpaper" />
</service>
o Nom du fond
d’écran (affiché à
l’utilisateur)
4
03Les fonds d’écran animés en (un peu) mieux
Pour rappel, un fond d’écran animé se définit dans l’AndroidManifest :
<service android:label=“@string/name"
android:name=".LWService"
android:permission="android.permission.BIND_WALLPAPER">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data
android:name="android.service.wallpaper"
android:resource="@xml/wallpaper" />
</service>
o
Définition des
propriétés du fond
d’écran
`
03Les fonds d’écran animés en (un peu) mieux
La configuration d’un fond d’écran animé (res/values) avant 7.1
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
android:author=“@string/wp_author"
android:description="@string/wp_description"
android:settingsActivity="fr.paug.livewallpaper.PrefsActivity"
android:thumbnail=“@drawable/wp_thumbnail" />
o
03Les fonds d’écran animés en (un peu) mieux
03Les fonds d’écran animés en (un peu) mieux
03Les fonds d’écran animés en (un peu) mieux
Metadata 

(désactivé par défaut)8
oandroid:showMetadataInPreview
03Les fonds d’écran animés en (un peu) mieux
Metadata 

(désactivé par défaut)8
oandroid:showMetadataInPreview
Label du Service
(AndroidManifest)0
oandroid:label
03Les fonds d’écran animés en (un peu) mieux
Metadata 

(désactivé par défaut)8
oandroid:showMetadataInPreview
Auteur7
oandroid:author
03Les fonds d’écran animés en (un peu) mieux
Metadata 

(désactivé par défaut)8
oandroid:showMetadataInPreview
Description7
oandroid:description
03Les fonds d’écran animés en (un peu) mieux
Metadata 

(désactivé par défaut)8
oandroid:showMetadataInPreview
Uri et description
(obligatoirement les deux)o
oandroid:contextUri
oandroid:contextDescription
03Les fonds d’écran animés en (un peu) mieux
La configuration d’un fond d’écran animé (res/values) depuis 7.1
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
android:author=“@string/wp_author”
android:contextDescription=“@string/wp_uri_desc”
android:contextUri=“@string/wp_uri”
android:description="@string/wp_description"
android:settingsActivity="fr.paug.livewallpaper.PrefsActivity"
android:thumbnail=“@drawable/wp_thumbnail”
android:showMetadataInPreview="true" />
o
04Insérer des images
depuis le clavier
Rétro-compatible avec Android 3.2 (Honeycomb)
Avec la support-library-v13
y
]H
 8
G
Transmission mime types
L’EditText va envoyer la liste des
mime types souhaités au clavier
Envoi de l’URI
Méthode onCommitContent() du
Callback appelé
Utilisateur clique
Un EditText récupère le focus
Clavier avec mime types
L’utilisateur peut alors choisir un gif
Gestion des permissions
Sur Android 7.1+, une permission
temporaire est donnée
04Insérer des images depuis le clavier
Modifier le comportement de vos EditText
EditText editText = new EditText(this) {
@Override
public InputConnection onCreateInputConnection(EditorInfo editorInfo) {
final InputConnection ic = super.onCreateInputConnection(editorInfo);
EditorInfoCompat.setContentMimeTypes(editorInfo, mimeTypes);
final InputConnectionCompat.OnCommitContentListener callback =
new InputConnectionCompat.OnCommitContentListener() {
@Override
public boolean onCommitContent() {…}
};
return InputConnectionCompat.createWrapper(ic, editorInfo, callback);
}
};
o
04Insérer des images depuis le clavier
Modifier le comportement de vos EditText
EditText editText = new EditText(this) {
@Override
public InputConnection onCreateInputConnection(EditorInfo editorInfo) {
final InputConnection ic = super.onCreateInputConnection(editorInfo);
EditorInfoCompat.setContentMimeTypes(editorInfo, mimeTypes);
final InputConnectionCompat.OnCommitContentListener callback =
new InputConnectionCompat.OnCommitContentListener() {
@Override
public boolean onCommitContent() {…}
};
return InputConnectionCompat.createWrapper(ic, editorInfo, callback);
}
};
o
04Insérer des images depuis le clavier
Modifier le comportement de vos EditText
EditText exitText = new EditText(this) {
@Override
public InputConnection onCreateInputConnection(EditorInfo editorInfo) {
final InputConnection ic = super.onCreateInputConnection(editorInfo);
EditorInfoCompat.setContentMimeTypes(editorInfo, mimeTypes);
final InputConnectionCompat.OnCommitContentListener callback =
new InputConnectionCompat.OnCommitContentListener() {
@Override
public boolean onCommitContent() {…}
};
return InputConnectionCompat.createWrapper(ic, editorInfo, callback);
}
};
o
Liste de mime-
types8
onew String[] 

{“image/gif”}
04Insérer des images depuis le clavier
Vérifier que l’on possède la permission d’accéder au contenu (uniquement depuis Android 7.1)
public boolean onCommitContent(InputContentInfoCompat inputContentInfo,
int flags, Bundle opts) {
if (BuildCompat.isAtLeastNMR1() && (flags & 

InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) {
try {
inputContentInfo.requestPermission();
} catch (Exception e) {
return false;
}
}
// …
inputContentInfo.releasePermission();
return true;
}
o
04Insérer des images depuis le clavier
Vérifier que l’on possède la permission d’accéder au contenu (uniquement depuis Android 7.1)
public boolean onCommitContent(InputContentInfoCompat inputContentInfo,
int flags, Bundle opts) {
if (BuildCompat.isAtLeastNMR1() && (flags & 

InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) {
try {
inputContentInfo.requestPermission();
} catch (Exception e) {
return false;
}
}
// …
inputContentInfo.releasePermission();
return true;
}
o
Demander une
permission
temporaire
W
04Insérer des images depuis le clavier
Accéder au contenu (à partir du InputContentInfo)
String[] mimeTypes = inputContentInfo.getDescription().filterMimeTypes("*/*");
Uri contentUri = inputContentInfo.getContentUri();
String description = inputContentInfo.getDescription().getLabel();
@Nullable
Uri link = inputContentInfo.getLinkUri();
o
05Les App
Shortcuts
Force touch-like
2
App Shortcut != Shortcut
A ne pas confondre avec les
shortcuts (API 11)
!
05Les App
Shortcuts
Ils peuvent être épinglés
2
05Les App Shortcuts
Les raccourcis statiques se créent en xml sur les Activités affichées sur le launcher
<activity android:name=“.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
o
05Les App Shortcuts
Les raccourcis statiques se créent en xml sur les Activités affichées sur le launcher
<activity android:name=“.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
o
05Les App Shortcuts
Les raccourcis statiques se créent en xml
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut android:shortcutId="compose"
android:enabled="true"
android:icon="@drawable/compose_icon"
android:shortcutShortLabel="@string/compose_shortcut_short_label1"
android:shortcutLongLabel="@string/compose_shortcut_long_label1"
android:shortcutDisabledMessage="@string/compose_disabled_message1">
<intent android:action="android.intent.action.VIEW"
android:targetPackage=“fr.paug.myapplication"
android:targetClass=“fr.paug.myapplication.EasterEggActivity" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
</shortcuts>
o
05Les App Shortcuts
Les raccourcis statiques se créent en xml
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut android:shortcutId="compose"
android:enabled="true"
android:icon="@drawable/compose_icon"
android:shortcutShortLabel="@string/compose_shortcut_short_label1"
android:shortcutLongLabel="@string/compose_shortcut_long_label1"
android:shortcutDisabledMessage="@string/compose_disabled_message1">
<intent android:action="android.intent.action.VIEW"
android:targetPackage=“fr.paug.myapplication"
android:targetClass=“fr.paug.myapplication.EasterEggActivity" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
</shortcuts>
o
05Les App Shortcuts
Les raccourcis statiques se créent en xml
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut android:shortcutId="compose"
android:enabled="true"
android:icon="@drawable/compose_icon"
android:shortcutShortLabel="@string/compose_shortcut_short_label1"
android:shortcutLongLabel="@string/compose_shortcut_long_label1"
android:shortcutDisabledMessage="@string/compose_disabled_message1">
<intent android:action="android.intent.action.VIEW"
android:targetPackage=“fr.paug.myapplication"
android:targetClass=“fr.paug.myapplication.EasterEggActivity" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
</shortcuts>
o
On peut donner
plusieurs Intent
(backstack)
z
05Les App Shortcuts
Ajouter des raccourcis dynamiques
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "compose")
.setIntent(new Intent(...)))
.setShortLabel("Label")
.setLongLabel(“Long label”)
.setDisabledLabel(“Disabled label”)
.setIcon(Icon.createWithResource(context, R.drawable.ic_shortcut))
.setActivity(new ComponentName(context.getPackageName(), “.MainActivity”)
.setRank(0)
.build();
shortcutManager.addDynamicShortcuts(Arrays.asList(shortcut));
o
05Les App Shortcuts
Ajouter des raccourcis dynamiques
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "compose")
.setIntent(new Intent(...)))
.setShortLabel("Label")
.setLongLabel(“Long label”)
.setDisabledLabel(“Disabled label”)
.setIcon(Icon.createWithResource(context, R.drawable.ic_shortcut))
.setActivity(new ComponentName(context.getPackageName(), “.MainActivity”)
.setRank(0)
.build();
shortcutManager.addDynamicShortcuts(Arrays.asList(shortcut));
o
Existe aussi avec
setIntents(

Intent[])
z
05Les App Shortcuts
Ajouter des raccourcis dynamiques
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "compose")
.setIntent(new Intent(...)))
.setShortLabel("Label")
.setLongLabel(“Long label”)
.setDisabledLabel(“Disabled label”)
.setIcon(Icon.createWithResource(context, R.drawable.ic_shortcut))
.setActivity(new ComponentName(context.getPackageName(), “.MainActivity”)
.setRank(0)
.build();
shortcutManager.addDynamicShortcuts(Arrays.asList(shortcut));
o
Nombre maximum
de raccourcisG
oShortcutManager

.getMaxShortcutCount

PerActivity()
05Les App Shortcuts
Ajouter des raccourcis dynamiques
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "compose")
.setIntent(new Intent(...)))
.setShortLabel("Label")
.setLongLabel(“Long label”)
.setDisabledLabel(“Disabled label”)
.setIcon(Icon.createWithResource(context, R.drawable.ic_shortcut))
.setActivity(new ComponentName(context.getPackageName(), “.MainActivity”)
.setRank(0)
.build();
shortcutManager.addDynamicShortcuts(Arrays.asList(shortcut));
o
Nombre maximum
de raccourcisG
oShortcutManager

.getMaxShortcutCount

PerActivity()
Existe aussi
avec/
oupdateDynamicShortcuts
osetDynamicShortcuts
oremoveDynamicShortcuts
05Les App Shortcuts
Activer / Désactiver des raccourcis
ShortcutManager shortcutManager = 

getSystemService(ShortcutManager.class);
shortcutManager.enableShortcuts(Arrays.asList(“compose”));
shortcutManager.disableShortcuts(Arrays.asList(“compose”));
B Icônes rondes
B Nouvel Intent
B
Metadata des fonds
d’écran animés
B Clavier avec images
B App Shortcuts
Merci !
Questions ?
@g123kL +EdouardMarquezG

Contenu connexe

En vedette

Android N is now Android Nougat
Android N is now Android NougatAndroid N is now Android Nougat
Android N is now Android NougatAppinventiv
 
From nice to astonishing
From nice to astonishingFrom nice to astonishing
From nice to astonishingQuentin Sallat
 
Android nougat 7.1 | Top Mobile App Development Company
Android nougat 7.1 | Top Mobile App Development CompanyAndroid nougat 7.1 | Top Mobile App Development Company
Android nougat 7.1 | Top Mobile App Development Companytechugo
 
Google Android 7.0 Nougat History Features and more
Google Android 7.0 Nougat History Features and moreGoogle Android 7.0 Nougat History Features and more
Google Android 7.0 Nougat History Features and moreDevakumar Kp
 

En vedette (6)

Android N is now Android Nougat
Android N is now Android NougatAndroid N is now Android Nougat
Android N is now Android Nougat
 
From nice to astonishing
From nice to astonishingFrom nice to astonishing
From nice to astonishing
 
Wearable Technology Applications for Smart Solutions
Wearable Technology Applications for Smart SolutionsWearable Technology Applications for Smart Solutions
Wearable Technology Applications for Smart Solutions
 
iOS 10 or Android Nougat? Who is leading the era
iOS 10 or Android Nougat? Who is leading the eraiOS 10 or Android Nougat? Who is leading the era
iOS 10 or Android Nougat? Who is leading the era
 
Android nougat 7.1 | Top Mobile App Development Company
Android nougat 7.1 | Top Mobile App Development CompanyAndroid nougat 7.1 | Top Mobile App Development Company
Android nougat 7.1 | Top Mobile App Development Company
 
Google Android 7.0 Nougat History Features and more
Google Android 7.0 Nougat History Features and moreGoogle Android 7.0 Nougat History Features and more
Google Android 7.0 Nougat History Features and more
 

Similaire à Les nouveautés d'Android 7.1 (Nougat)

Présentation : Projet de Fin d'etude ' PFE ' 2018 : Conception et Réalisation...
Présentation : Projet de Fin d'etude ' PFE ' 2018 : Conception et Réalisation...Présentation : Projet de Fin d'etude ' PFE ' 2018 : Conception et Réalisation...
Présentation : Projet de Fin d'etude ' PFE ' 2018 : Conception et Réalisation...Achraf Frouja
 
Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Farouk Mezghich
 
Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mathias Seguy
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Saber LAJILI
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Sabeur LAJILI
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Sabeur LAJILI
 
Développement d'applications mobiles.. Environnement de programmation visuelle
Développement d'applications mobiles.. Environnement de programmation visuelleDéveloppement d'applications mobiles.. Environnement de programmation visuelle
Développement d'applications mobiles.. Environnement de programmation visuelleREGIONAL ACADEMY OF EDUCATION AND TRAINING
 
Introduction à Android
Introduction à AndroidIntroduction à Android
Introduction à AndroidYoann Gotthilf
 
Etendre ses applications aux smartwatches et TVs android
Etendre ses applications aux smartwatches et TVs androidEtendre ses applications aux smartwatches et TVs android
Etendre ses applications aux smartwatches et TVs androidXavier Hallade
 
Création d’applications et découverte d’Android
Création d’applications et découverte d’AndroidCréation d’applications et découverte d’Android
Création d’applications et découverte d’AndroidENSAM Casablanca
 
Introduction au développement Android
Introduction au développement AndroidIntroduction au développement Android
Introduction au développement AndroidSteve Tremblay
 
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...Cyber Security Alliance
 
Initiation au développement mobile sous Android
Initiation au développement mobile sous AndroidInitiation au développement mobile sous Android
Initiation au développement mobile sous AndroidAbdelkader Rhouati
 
Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielleECAM Brussels Engineering School
 
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)Bruno Bonnin
 
Introduction à Android - Mars 2012
Introduction à Android - Mars 2012Introduction à Android - Mars 2012
Introduction à Android - Mars 2012Aurélien Guillard
 

Similaire à Les nouveautés d'Android 7.1 (Nougat) (20)

Présentation : Projet de Fin d'etude ' PFE ' 2018 : Conception et Réalisation...
Présentation : Projet de Fin d'etude ' PFE ' 2018 : Conception et Réalisation...Présentation : Projet de Fin d'etude ' PFE ' 2018 : Conception et Réalisation...
Présentation : Projet de Fin d'etude ' PFE ' 2018 : Conception et Réalisation...
 
Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)
 
Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015
 
Développement d'applications mobiles.. Environnement de programmation visuelle
Développement d'applications mobiles.. Environnement de programmation visuelleDéveloppement d'applications mobiles.. Environnement de programmation visuelle
Développement d'applications mobiles.. Environnement de programmation visuelle
 
3D Touch
3D Touch3D Touch
3D Touch
 
Introduction à Android
Introduction à AndroidIntroduction à Android
Introduction à Android
 
Spring ioc
Spring iocSpring ioc
Spring ioc
 
Etendre ses applications aux smartwatches et TVs android
Etendre ses applications aux smartwatches et TVs androidEtendre ses applications aux smartwatches et TVs android
Etendre ses applications aux smartwatches et TVs android
 
TP_1.pdf
TP_1.pdfTP_1.pdf
TP_1.pdf
 
Création d’applications et découverte d’Android
Création d’applications et découverte d’AndroidCréation d’applications et découverte d’Android
Création d’applications et découverte d’Android
 
Personnalisation bouton et animations Android
Personnalisation bouton et animations AndroidPersonnalisation bouton et animations Android
Personnalisation bouton et animations Android
 
Introduction au développement Android
Introduction au développement AndroidIntroduction au développement Android
Introduction au développement Android
 
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
 
Initiation au développement mobile sous Android
Initiation au développement mobile sous AndroidInitiation au développement mobile sous Android
Initiation au développement mobile sous Android
 
Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielle
 
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
 
Introduction à Android - Mars 2012
Introduction à Android - Mars 2012Introduction à Android - Mars 2012
Introduction à Android - Mars 2012
 

Les nouveautés d'Android 7.1 (Nougat)

  • 1. Android 7.1Quelles sont les nouveautés ?
  • 2. Edouard MarquezMangueur de nougats et de pommes Développeur Android Freelance Organisateur du Paris Android User Group @g123kL +EdouardMarquezG
  • 3. 01Des icônes rondes Que nous réservera la prochaine version d’Android ? B
  • 4. 01Des icônes rondes AndroidManifest.xml <application android:icon="@mipmap/ic_launcher"
 android:label="@string/app_name" android:roundIcon="@mipmap/ic_icon2"> Mais on peut faire ce que l’on veut Il est tout à fait possible de donner une image qui n’est pas ronde. Les launchers ne forcent pas pour le moment la forme ronde. o 6
  • 5. 01Des icônes rondes AndroidManifest.xml <application android:icon="@mipmap/ic_launcher"
 android:label="@string/app_name" android:roundIcon="@mipmap/ic_icon2"> Mais on peut faire ce que l’on veut Il est tout à fait possible de donner une image qui n’est pas ronde. Les launchers ne forcent pas pour le moment la forme ronde. o 6
  • 6. 02Libérer de l’espace sur le disque Nouvel Intent StorageManager.ACTION_MANAGE_STORAGEo
  • 8. 03Les fonds d’écran animés en (un peu) mieux Pour rappel, un fond d’écran animé se définit dans l’AndroidManifest : <service android:label=“@string/name" android:name=".LWService" android:permission="android.permission.BIND_WALLPAPER"> <intent-filter> <action android:name="android.service.wallpaper.WallpaperService" /> </intent-filter> <meta-data android:name="android.service.wallpaper" android:resource="@xml/wallpaper" /> </service> o
  • 9. 03Les fonds d’écran animés en (un peu) mieux Pour rappel, un fond d’écran animé se définit dans l’AndroidManifest : <service android:label=“@string/name" android:name=".LWService" android:permission="android.permission.BIND_WALLPAPER"> <intent-filter> <action android:name="android.service.wallpaper.WallpaperService" /> </intent-filter> <meta-data android:name="android.service.wallpaper" android:resource="@xml/wallpaper" /> </service> o Service Android8 oextends AndroidLiveWallpaper
 Service
  • 10. 03Les fonds d’écran animés en (un peu) mieux Pour rappel, un fond d’écran animé se définit dans l’AndroidManifest : <service android:label=“@string/name" android:name=".LWService" android:permission="android.permission.BIND_WALLPAPER"> <intent-filter> <action android:name="android.service.wallpaper.WallpaperService" /> </intent-filter> <meta-data android:name="android.service.wallpaper" android:resource="@xml/wallpaper" /> </service> o Nom du fond d’écran (affiché à l’utilisateur) 4
  • 11. 03Les fonds d’écran animés en (un peu) mieux Pour rappel, un fond d’écran animé se définit dans l’AndroidManifest : <service android:label=“@string/name" android:name=".LWService" android:permission="android.permission.BIND_WALLPAPER"> <intent-filter> <action android:name="android.service.wallpaper.WallpaperService" /> </intent-filter> <meta-data android:name="android.service.wallpaper" android:resource="@xml/wallpaper" /> </service> o Définition des propriétés du fond d’écran `
  • 12. 03Les fonds d’écran animés en (un peu) mieux La configuration d’un fond d’écran animé (res/values) avant 7.1 <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" android:author=“@string/wp_author" android:description="@string/wp_description" android:settingsActivity="fr.paug.livewallpaper.PrefsActivity" android:thumbnail=“@drawable/wp_thumbnail" /> o
  • 13. 03Les fonds d’écran animés en (un peu) mieux
  • 14. 03Les fonds d’écran animés en (un peu) mieux
  • 15. 03Les fonds d’écran animés en (un peu) mieux Metadata 
 (désactivé par défaut)8 oandroid:showMetadataInPreview
  • 16. 03Les fonds d’écran animés en (un peu) mieux Metadata 
 (désactivé par défaut)8 oandroid:showMetadataInPreview Label du Service (AndroidManifest)0 oandroid:label
  • 17. 03Les fonds d’écran animés en (un peu) mieux Metadata 
 (désactivé par défaut)8 oandroid:showMetadataInPreview Auteur7 oandroid:author
  • 18. 03Les fonds d’écran animés en (un peu) mieux Metadata 
 (désactivé par défaut)8 oandroid:showMetadataInPreview Description7 oandroid:description
  • 19. 03Les fonds d’écran animés en (un peu) mieux Metadata 
 (désactivé par défaut)8 oandroid:showMetadataInPreview Uri et description (obligatoirement les deux)o oandroid:contextUri oandroid:contextDescription
  • 20. 03Les fonds d’écran animés en (un peu) mieux La configuration d’un fond d’écran animé (res/values) depuis 7.1 <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" android:author=“@string/wp_author” android:contextDescription=“@string/wp_uri_desc” android:contextUri=“@string/wp_uri” android:description="@string/wp_description" android:settingsActivity="fr.paug.livewallpaper.PrefsActivity" android:thumbnail=“@drawable/wp_thumbnail” android:showMetadataInPreview="true" /> o
  • 21. 04Insérer des images depuis le clavier Rétro-compatible avec Android 3.2 (Honeycomb) Avec la support-library-v13 y
  • 22. ]H  8 G Transmission mime types L’EditText va envoyer la liste des mime types souhaités au clavier Envoi de l’URI Méthode onCommitContent() du Callback appelé Utilisateur clique Un EditText récupère le focus Clavier avec mime types L’utilisateur peut alors choisir un gif Gestion des permissions Sur Android 7.1+, une permission temporaire est donnée
  • 23. 04Insérer des images depuis le clavier Modifier le comportement de vos EditText EditText editText = new EditText(this) { @Override public InputConnection onCreateInputConnection(EditorInfo editorInfo) { final InputConnection ic = super.onCreateInputConnection(editorInfo); EditorInfoCompat.setContentMimeTypes(editorInfo, mimeTypes); final InputConnectionCompat.OnCommitContentListener callback = new InputConnectionCompat.OnCommitContentListener() { @Override public boolean onCommitContent() {…} }; return InputConnectionCompat.createWrapper(ic, editorInfo, callback); } }; o
  • 24. 04Insérer des images depuis le clavier Modifier le comportement de vos EditText EditText editText = new EditText(this) { @Override public InputConnection onCreateInputConnection(EditorInfo editorInfo) { final InputConnection ic = super.onCreateInputConnection(editorInfo); EditorInfoCompat.setContentMimeTypes(editorInfo, mimeTypes); final InputConnectionCompat.OnCommitContentListener callback = new InputConnectionCompat.OnCommitContentListener() { @Override public boolean onCommitContent() {…} }; return InputConnectionCompat.createWrapper(ic, editorInfo, callback); } }; o
  • 25. 04Insérer des images depuis le clavier Modifier le comportement de vos EditText EditText exitText = new EditText(this) { @Override public InputConnection onCreateInputConnection(EditorInfo editorInfo) { final InputConnection ic = super.onCreateInputConnection(editorInfo); EditorInfoCompat.setContentMimeTypes(editorInfo, mimeTypes); final InputConnectionCompat.OnCommitContentListener callback = new InputConnectionCompat.OnCommitContentListener() { @Override public boolean onCommitContent() {…} }; return InputConnectionCompat.createWrapper(ic, editorInfo, callback); } }; o Liste de mime- types8 onew String[] 
 {“image/gif”}
  • 26. 04Insérer des images depuis le clavier Vérifier que l’on possède la permission d’accéder au contenu (uniquement depuis Android 7.1) public boolean onCommitContent(InputContentInfoCompat inputContentInfo, int flags, Bundle opts) { if (BuildCompat.isAtLeastNMR1() && (flags & 
 InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) { try { inputContentInfo.requestPermission(); } catch (Exception e) { return false; } } // … inputContentInfo.releasePermission(); return true; } o
  • 27. 04Insérer des images depuis le clavier Vérifier que l’on possède la permission d’accéder au contenu (uniquement depuis Android 7.1) public boolean onCommitContent(InputContentInfoCompat inputContentInfo, int flags, Bundle opts) { if (BuildCompat.isAtLeastNMR1() && (flags & 
 InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) { try { inputContentInfo.requestPermission(); } catch (Exception e) { return false; } } // … inputContentInfo.releasePermission(); return true; } o Demander une permission temporaire W
  • 28. 04Insérer des images depuis le clavier Accéder au contenu (à partir du InputContentInfo) String[] mimeTypes = inputContentInfo.getDescription().filterMimeTypes("*/*"); Uri contentUri = inputContentInfo.getContentUri(); String description = inputContentInfo.getDescription().getLabel(); @Nullable Uri link = inputContentInfo.getLinkUri(); o
  • 30. App Shortcut != Shortcut A ne pas confondre avec les shortcuts (API 11) !
  • 31. 05Les App Shortcuts Ils peuvent être épinglés 2
  • 32. 05Les App Shortcuts Les raccourcis statiques se créent en xml sur les Activités affichées sur le launcher <activity android:name=“.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" /> </activity> o
  • 33. 05Les App Shortcuts Les raccourcis statiques se créent en xml sur les Activités affichées sur le launcher <activity android:name=“.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" /> </activity> o
  • 34. 05Les App Shortcuts Les raccourcis statiques se créent en xml <shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <shortcut android:shortcutId="compose" android:enabled="true" android:icon="@drawable/compose_icon" android:shortcutShortLabel="@string/compose_shortcut_short_label1" android:shortcutLongLabel="@string/compose_shortcut_long_label1" android:shortcutDisabledMessage="@string/compose_disabled_message1"> <intent android:action="android.intent.action.VIEW" android:targetPackage=“fr.paug.myapplication" android:targetClass=“fr.paug.myapplication.EasterEggActivity" /> <categories android:name="android.shortcut.conversation" /> </shortcut> </shortcuts> o
  • 35. 05Les App Shortcuts Les raccourcis statiques se créent en xml <shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <shortcut android:shortcutId="compose" android:enabled="true" android:icon="@drawable/compose_icon" android:shortcutShortLabel="@string/compose_shortcut_short_label1" android:shortcutLongLabel="@string/compose_shortcut_long_label1" android:shortcutDisabledMessage="@string/compose_disabled_message1"> <intent android:action="android.intent.action.VIEW" android:targetPackage=“fr.paug.myapplication" android:targetClass=“fr.paug.myapplication.EasterEggActivity" /> <categories android:name="android.shortcut.conversation" /> </shortcut> </shortcuts> o
  • 36. 05Les App Shortcuts Les raccourcis statiques se créent en xml <shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <shortcut android:shortcutId="compose" android:enabled="true" android:icon="@drawable/compose_icon" android:shortcutShortLabel="@string/compose_shortcut_short_label1" android:shortcutLongLabel="@string/compose_shortcut_long_label1" android:shortcutDisabledMessage="@string/compose_disabled_message1"> <intent android:action="android.intent.action.VIEW" android:targetPackage=“fr.paug.myapplication" android:targetClass=“fr.paug.myapplication.EasterEggActivity" /> <categories android:name="android.shortcut.conversation" /> </shortcut> </shortcuts> o On peut donner plusieurs Intent (backstack) z
  • 37. 05Les App Shortcuts Ajouter des raccourcis dynamiques ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "compose") .setIntent(new Intent(...))) .setShortLabel("Label") .setLongLabel(“Long label”) .setDisabledLabel(“Disabled label”) .setIcon(Icon.createWithResource(context, R.drawable.ic_shortcut)) .setActivity(new ComponentName(context.getPackageName(), “.MainActivity”) .setRank(0) .build(); shortcutManager.addDynamicShortcuts(Arrays.asList(shortcut)); o
  • 38. 05Les App Shortcuts Ajouter des raccourcis dynamiques ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "compose") .setIntent(new Intent(...))) .setShortLabel("Label") .setLongLabel(“Long label”) .setDisabledLabel(“Disabled label”) .setIcon(Icon.createWithResource(context, R.drawable.ic_shortcut)) .setActivity(new ComponentName(context.getPackageName(), “.MainActivity”) .setRank(0) .build(); shortcutManager.addDynamicShortcuts(Arrays.asList(shortcut)); o Existe aussi avec setIntents(
 Intent[]) z
  • 39. 05Les App Shortcuts Ajouter des raccourcis dynamiques ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "compose") .setIntent(new Intent(...))) .setShortLabel("Label") .setLongLabel(“Long label”) .setDisabledLabel(“Disabled label”) .setIcon(Icon.createWithResource(context, R.drawable.ic_shortcut)) .setActivity(new ComponentName(context.getPackageName(), “.MainActivity”) .setRank(0) .build(); shortcutManager.addDynamicShortcuts(Arrays.asList(shortcut)); o Nombre maximum de raccourcisG oShortcutManager
 .getMaxShortcutCount
 PerActivity()
  • 40. 05Les App Shortcuts Ajouter des raccourcis dynamiques ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "compose") .setIntent(new Intent(...))) .setShortLabel("Label") .setLongLabel(“Long label”) .setDisabledLabel(“Disabled label”) .setIcon(Icon.createWithResource(context, R.drawable.ic_shortcut)) .setActivity(new ComponentName(context.getPackageName(), “.MainActivity”) .setRank(0) .build(); shortcutManager.addDynamicShortcuts(Arrays.asList(shortcut)); o Nombre maximum de raccourcisG oShortcutManager
 .getMaxShortcutCount
 PerActivity() Existe aussi avec/ oupdateDynamicShortcuts osetDynamicShortcuts oremoveDynamicShortcuts
  • 41. 05Les App Shortcuts Activer / Désactiver des raccourcis ShortcutManager shortcutManager = 
 getSystemService(ShortcutManager.class); shortcutManager.enableShortcuts(Arrays.asList(“compose”)); shortcutManager.disableShortcuts(Arrays.asList(“compose”));
  • 42. B Icônes rondes B Nouvel Intent B Metadata des fonds d’écran animés B Clavier avec images B App Shortcuts
  • 43. Merci ! Questions ? @g123kL +EdouardMarquezG