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>
oService 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>
oDé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
o android:showMetadataInPreview
03Les fonds d’écran animés en (un peu) mieux
Metadata (désactivé par défaut)8
o android:showMetadataInPreview
Label du Service (AndroidManifest)0
o android:label
03Les fonds d’écran animés en (un peu) mieux
Metadata (désactivé par défaut)8
o android:showMetadataInPreview
Auteur7
o android:author
03Les fonds d’écran animés en (un peu) mieux
Metadata (désactivé par défaut)8
o android:showMetadataInPreview
Description7
o android:description
03Les fonds d’écran animés en (un peu) mieux
Metadata (désactivé par défaut)8
o android:showMetadataInPreview
Uri et description (obligatoirement les deux)o
o android:contextUri
o android: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 typesL’EditText va envoyer la liste des mime types souhaités au clavier
Envoi de l’URIMéthode onCommitContent() du Callback appelé
Utilisateur cliqueUn EditText récupère le focus
Clavier avec mime typesL’utilisateur peut alors choisir un gif
Gestion des permissionsSur 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
BMetadata des fonds d’écran animés
B Clavier avec images
B App Shortcuts
Merci !Questions ?
@g123kL +EdouardMarquezG
Top Related