Quelques semaines après la sortie d'Android 7.0, Google a annoncé une nouvelle version mineure en même temps que ses smartphones Pixel.
On note cinq fonctionnalités principales :
- Les icônes rondes
- Un nouvel Intent
- Les metadonnées des fonds d'écran animés (live wallpapers)
- L'insertion d'images depuis le clavier
- Les App Shortcuts
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
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
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