API Android 4.1

Niveau d'API: 16

Android 4.1 (JELLY_BEAN) est une progression de la plate-forme qui offre de meilleures performances et une meilleure expérience utilisateur. Elle ajoute de nouvelles fonctionnalités pour les utilisateurs et les développeurs d'applications. Ce document présente les nouvelles API les plus importantes et les plus utiles pour les développeurs d'applications.

En tant que développeur d'applications, Android 4.1 est disponible dans SDK Manager sous la forme d'une image système que vous pouvez exécuter dans Android Emulator et d'une plate-forme SDK sur laquelle vous pouvez compiler votre application. Vous devez télécharger l'image système et la plate-forme dès que possible pour compiler et tester votre application sur Android 4.1.

Afin d'optimiser votre application pour les appareils équipés d'Android 4.1, vous devez définir targetSdkVersion sur "16", l'installer sur une image système Android 4.1, la tester, puis publier une mise à jour avec cette modification.

Vous pouvez utiliser des API dans Android 4.1 tout en prenant en charge les anciennes versions en ajoutant à votre code des conditions qui vérifient le niveau d'API du système avant d'exécuter des API non compatibles avec votre minSdkVersion. Pour en savoir plus sur le maintien de la rétrocompatibilité, consultez la page Créer des interfaces utilisateur rétrocompatibles.

Pour en savoir plus sur le fonctionnement des niveaux d'API, consultez Qu'est-ce que le niveau d'API ?

Composants de l'appli

Services isolés

Si vous spécifiez android:isolatedProcess="true" dans la balise <service>, votre Service s'exécutera sous son propre processus d'ID utilisateur isolé qui ne dispose pas de ses propres autorisations.

Gestion de la mémoire

Les nouvelles constantes ComponentCallbacks2, telles que TRIM_MEMORY_RUNNING_LOW et TRIM_MEMORY_RUNNING_CRITICAL, fournissent plus d'informations sur l'état de la mémoire avant que le système n'appelle onLowMemory().

La nouvelle méthode getMyMemoryState(ActivityManager.RunningAppProcessInfo) vous permet de récupérer l'état général de la mémoire.

Fournisseurs de contenu

Une nouvelle méthode, acquireUnstableContentProviderClient(), vous permet d'accéder à un ContentProviderClient qui peut être "instable" afin que votre application ne plante pas si le fournisseur de contenu le fait. Elle est utile lorsque vous interagissez avec des fournisseurs de contenu dans une application distincte.

Fonds d'écran animés

Nouveau protocole d'intent permettant de lancer directement l'activité d'aperçu du fond d'écran animé afin d'aider les utilisateurs à sélectionner facilement votre fond d'écran animé sans les forcer à quitter votre application et à naviguer dans le sélecteur de fond d'écran d'accueil.

Pour lancer le sélecteur de fond d'écran animé, appelez startActivity() avec un Intent à l'aide de ACTION_CHANGE_LIVE_WALLPAPER et un extra qui spécifie votre ComponentName de fond d'écran animé en tant que chaîne dans EXTRA_LIVE_WALLPAPER_COMPONENT.

Navigation dans la pile d'applications

Android 4.1 facilite grandement l'implémentation des modèles de conception appropriés pour la navigation vers le haut. Il vous suffit d'ajouter le android:parentActivityName à chaque élément <activity> de votre fichier manifeste. Le système utilise ces informations pour ouvrir l'activité appropriée lorsque l'utilisateur appuie sur le bouton "Haut" de la barre d'action (tout en terminant l'activité en cours). Ainsi, si vous déclarez android:parentActivityName pour chaque activité, vous n'avez pas besoin de la méthode onOptionsItemSelected() pour gérer les événements de clic sur l'icône d'application de la barre d'action. Le système gère maintenant cet événement et reprend ou crée l'activité appropriée.

Cette approche est particulièrement utile pour les scénarios dans lesquels l'utilisateur saisit l'une des activités de votre application via un intent d'analyse détaillée, par exemple à partir d'une notification ou d'un intent d'une autre application (comme décrit dans le guide de conception pour la navigation entre les applications). Lorsque l'utilisateur accède à votre activité de cette manière, il est possible que votre application ne comporte pas naturellement une pile d'activités "Retour" qui peut être réactivée lorsque l'utilisateur accède à la page précédente. Toutefois, lorsque vous fournissez l'attribut android:parentActivityName pour vos activités, le système détermine si votre application contient déjà une pile "Retour" d'activités parentes et, si ce n'est pas le cas, construit une pile "Retour" synthétique contenant toutes les activités parentes.

Remarque:Lorsque l'utilisateur entre dans une activité profonde dans votre application et qu'il crée une tâche pour celle-ci, le système insère en fait la pile d'activités parentes dans la tâche. Ainsi, le bouton "Retour" permet également de revenir en arrière dans la pile d'activités parentes.

Lorsque le système crée une pile "Retour" synthétique pour votre application, il compile un Intent de base pour créer une instance de chaque activité parente. Il n'y a donc pas d'état enregistré pour les activités parentes comme vous le souhaiteriez si l'utilisateur parcourait naturellement chaque activité. Si l'une des activités parentes affiche normalement une UI qui dépend du contexte de l'utilisateur, ces informations contextuelles sont manquantes et vous devez les fournir lorsque l'utilisateur revient dans la pile. Par exemple, si l'utilisateur consulte un album dans une application musicale, la navigation vers le haut peut le rediriger vers une activité qui liste tous les albums d'un genre musical donné. Dans ce cas, si la pile doit être créée, vous devez indiquer à l'activité parent le genre auquel appartient l'album actuel afin que le parent puisse afficher la liste appropriée comme si l'utilisateur venait réellement de cette activité. Pour transmettre ces informations à une activité parente synthétique, vous devez remplacer la méthode onPrepareNavigateUpTaskStack(). Vous disposez ainsi d'un objet TaskStackBuilder créé par le système afin de synthétiser les activités parentes. TaskStackBuilder contient des objets Intent que le système utilise pour créer chaque activité parente. Dans votre implémentation de onPrepareNavigateUpTaskStack(), vous pouvez modifier le Intent approprié pour ajouter des données supplémentaires que l'activité parent peut utiliser pour déterminer le contexte approprié et afficher l'UI appropriée.

Lorsque le système crée le TaskStackBuilder, il ajoute les objets Intent utilisés pour créer les activités parentes dans leur ordre logique, en commençant par le haut de l'arborescence d'activités. Ainsi, le dernier Intent ajouté au tableau interne est le parent direct de l'activité actuelle. Si vous souhaitez modifier le Intent pour le parent de l'activité, commencez par déterminer la longueur du tableau avec getIntentCount(), puis transmettez cette valeur à editIntentAt().

Si la structure de votre application est plus complexe, plusieurs autres API sont disponibles. Elles vous permettent de gérer le comportement de la navigation vers le haut et de personnaliser entièrement la pile "Retour" synthétique. Voici quelques-unes des API qui vous offrent un contrôle supplémentaire:

onNavigateUp()
Remplacez cette option pour effectuer une action personnalisée lorsque l'utilisateur appuie sur le bouton "Haut".
navigateUpTo(Intent)
Appelez cette méthode pour terminer l'activité en cours et accéder à l'activité indiquée par le Intent fourni. Si l'activité existe dans la pile "Retour", mais n'est pas le parent le plus proche, toutes les autres activités entre l'activité actuelle et l'activité spécifiée avec l'intent sont également arrêtées.
getParentActivityIntent()
Appelez cette méthode pour obtenir la Intent qui démarrera le parent logique de l'activité actuelle.
shouldUpRecreateTask(Intent)
Appelez cette méthode pour demander si une pile "Retour" synthétique doit être créée pour pouvoir naviguer vers le haut. Renvoie la valeur "true" si une pile synthétique doit être créée et la valeur "false" si la pile appropriée existe déjà.
finishAffinity()
Appelez cette méthode pour terminer l'activité en cours et toutes les activités parentes avec la même affinité de tâches qui sont enchaînées à l'activité en cours. Si vous remplacez les comportements par défaut tels que onNavigateUp(), vous devez appeler cette méthode lorsque vous créez une pile "Retour" synthétique lors de la navigation vers le haut.
onCreateNavigateUpTaskStack
Remplacez cette valeur si vous devez contrôler entièrement la création de la pile de tâches synthétique. Si vous souhaitez simplement ajouter des données supplémentaires aux intents de votre pile "Retour", vous devez plutôt ignorer onPrepareNavigateUpTaskStack().

Toutefois, la plupart des applications n'ont pas besoin d'utiliser ces API ni d'implémenter onPrepareNavigateUpTaskStack(). Toutefois, elles peuvent obtenir le comportement approprié en ajoutant simplement android:parentActivityName à chaque élément <activity>.

Multimédia

Codecs multimédias

La classe MediaCodec permet d'accéder à des codecs multimédias de bas niveau pour encoder et décoder vos contenus multimédias. Vous pouvez instancier un MediaCodec en appelant createEncoderByType() pour encoder le contenu multimédia ou en appelant createDecoderByType() pour décoder le contenu multimédia. Chacune de ces méthodes utilise un type MIME pour le type de contenu multimédia que vous souhaitez encoder ou décoder, tel que "video/3gpp" ou "audio/vorbis".

Une fois l'instance MediaCodec créée, vous pouvez appeler configure() pour spécifier des propriétés telles que le format multimédia, ou pour indiquer si le contenu est chiffré ou non.

Que vous encodez ou décodez votre contenu multimédia, le reste du processus est le même après la création de la MediaCodec. Commencez par appeler getInputBuffers() pour obtenir un tableau d'objets ByteBuffer d'entrée et getOutputBuffers() pour obtenir un tableau d'objets ByteBuffer de sortie.

Lorsque vous êtes prêt à encoder ou à décoder, appelez dequeueInputBuffer() pour obtenir la position d'index de ByteBuffer (à partir du tableau de tampons d'entrée) à utiliser pour alimenter votre média source. Après avoir rempli ByteBuffer avec votre contenu multimédia source, libérez la propriété du tampon en appelant queueInputBuffer().

De même, pour le tampon de sortie, appelez dequeueOutputBuffer() pour obtenir la position d'index de ByteBuffer où vous recevrez les résultats. Après avoir lu le résultat de ByteBuffer, annulez la propriété en appelant releaseOutputBuffer().

Vous pouvez gérer les données multimédias chiffrées dans les codecs en appelant queueSecureInputBuffer() conjointement avec les API MediaCrypto, au lieu de la méthode queueInputBuffer() normale.

Pour en savoir plus sur l'utilisation des codecs, consultez la documentation MediaCodec.

Enregistrer un fichier audio à la file d'attente

La nouvelle méthode startRecording() vous permet de lancer un enregistrement audio en fonction d'un repère défini par un élément MediaSyncEvent. MediaSyncEvent spécifie une session audio (par exemple, une session définie par MediaPlayer), qui lorsqu'elle est terminée, déclenche l'enregistrement de l'enregistreur audio. Par exemple, vous pouvez utiliser cette fonctionnalité pour émettre une tonalité audio indiquant le début d'une session d'enregistrement. L'enregistrement démarre alors automatiquement. Vous n'avez donc pas besoin de synchroniser manuellement la tonalité et le début de l'enregistrement.

Pistes de texte temporisées

MediaPlayer gère désormais les pistes de texte in-band et hors bande. Les pistes de texte in-bandes se présentent sous la forme d'une piste de texte au sein d'une source multimédia MP4 ou 3GPP. Les pistes de texte hors bande peuvent être ajoutées en tant que source de texte externe via la méthode addTimedTextSource(). Une fois que toutes les sources de piste de texte externes ont été ajoutées, getTrackInfo() doit être appelé pour obtenir la liste actualisée de toutes les pistes disponibles dans une source de données.

Pour définir la piste à utiliser avec MediaPlayer, vous devez appeler selectTrack() en utilisant la position d'index de la piste que vous souhaitez utiliser.

Pour être averti lorsque la piste de texte est prête à être lue, implémentez l'interface MediaPlayer.OnTimedTextListener et transmettez-la à setOnTimedTextListener().

Effets audio

La classe AudioEffect est désormais compatible avec d'autres types de prétraitement audio lors de la capture audio:

  • L'AEC (AECoustic Echo canceler) avec AcousticEchoCanceler supprime la contribution du signal reçu du tiers distant au signal audio capturé.
  • Le contrôle automatique de gain (AGC) avec AutomaticGainControl normalise automatiquement la sortie du signal capturé.
  • La fonction de suppression de bruit (NS) avec NoiseSuppressor supprime le bruit de fond du signal capturé.

Vous pouvez appliquer ces effets de préprocesseur au contenu audio capturé avec un AudioRecord à l'aide de l'une des sous-classes AudioEffect.

Remarque:Il n'est pas garanti que tous les appareils prennent en charge ces effets. Vous devez donc toujours vérifier la disponibilité en appelant isAvailable() sur la classe d'effet audio correspondante.

Lecture sans interruption

Vous pouvez désormais effectuer une lecture sans interruption entre deux objets MediaPlayer distincts. À tout moment avant la fin de votre première MediaPlayer, appelez setNextMediaPlayer(). Android tente de démarrer le deuxième joueur au moment où le premier s'arrête.

Routeur multimédia. Les nouvelles API MediaRouter, MediaRouteActionProvider et MediaRouteButton fournissent des mécanismes standards et une interface utilisateur permettant de choisir où lire les contenus multimédias.

Appareil photo

Mouvement de mise au point automatique

La nouvelle interface Camera.AutoFocusMoveCallback vous permet d'écouter les modifications apportées au mouvement de la mise au point automatique. Vous pouvez enregistrer votre interface auprès de setAutoFocusMoveCallback(). Ensuite, lorsque la caméra est en mode autofocus continu (FOCUS_MODE_CONTINUOUS_VIDEO ou FOCUS_MODE_CONTINUOUS_PICTURE), vous recevez un appel à onAutoFocusMoving(), qui vous indique si la mise au point automatique a commencé ou s'est arrêtée.

Sons de l'appareil photo

La classe MediaActionSound fournit un ensemble simple d'API permettant de produire des sons standards émis par l'appareil photo ou d'autres actions multimédias. Utilisez ces API pour diffuser le son approprié lorsque vous créez une caméra fixe ou vidéo personnalisée.

Pour émettre un son, il vous suffit d'instancier un objet MediaActionSound, d'appeler load() pour précharger le son souhaité, puis d'appeler play() au moment opportun.

Connectivité

Android Beam

Android BeamTM est désormais compatible avec les transferts de charges utiles volumineuses via Bluetooth. Lorsque vous définissez les données à transférer avec la nouvelle méthode setBeamPushUris() ou la nouvelle interface de rappel NfcAdapter.CreateBeamUrisCallback, Android passe le transfert des données au Bluetooth ou à un autre moyen de transport pour obtenir des vitesses de transfert plus rapides. Cela est particulièrement utile pour les charges utiles volumineuses, telles que les fichiers image et audio, et ne nécessite aucune association visible entre les appareils. Aucune action supplémentaire n'est requise de la part de votre application pour bénéficier des transferts via Bluetooth.

La méthode setBeamPushUris() utilise un tableau d'objets Uri qui spécifient les données que vous souhaitez transférer depuis votre application. Vous pouvez également implémenter l'interface NfcAdapter.CreateBeamUrisCallback, que vous pouvez spécifier pour votre activité en appelant setBeamPushUrisCallback().

Lorsque vous utilisez l'interface de rappel, le système appelle la méthode createBeamUris() de l'interface lorsque l'utilisateur effectue un partage avec Android Beam afin que vous puissiez définir les URI à partager au moment du partage. Cela est utile si les URI à partager peuvent varier en fonction du contexte utilisateur dans l'activité, tandis que l'appel de setBeamPushUris() est utile lorsque les URI à partager ne changent pas et que vous pouvez les définir en toute sécurité à l'avance.

Identification du service réseau

Android 4.1 prend en charge la détection de services basée sur le DNS multicast, ce qui vous permet de rechercher et de vous connecter à des services proposés par des appareils similaires via le Wi-Fi, tels que des appareils mobiles, des imprimantes, des appareils photo, des lecteurs multimédias et autres qui sont enregistrés sur le réseau local.

Le nouveau package android.net.nsd contient les nouvelles API qui vous permettent de diffuser vos services sur le réseau local, de détecter les appareils locaux sur le réseau et de vous connecter aux appareils.

Pour enregistrer votre service, vous devez d'abord créer un objet NsdServiceInfo et définir ses différentes propriétés à l'aide de méthodes telles que setServiceName(), setServiceType() et setPort().

Vous devez ensuite implémenter NsdManager.RegistrationListener et le transmettre à registerService() avec votre NsdServiceInfo.

Pour découvrir des services sur le réseau, implémentez NsdManager.DiscoveryListener et transmettez-le à discoverServices().

Lorsque votre NsdManager.DiscoveryListener reçoit des rappels sur les services détectés, vous devez résoudre le service en appelant resolveService(), en lui transmettant une implémentation de NsdManager.ResolveListener qui reçoit un objet NsdServiceInfo contenant des informations sur le service découvert, ce qui vous permet d'établir la connexion.

Détection de services Wi-Fi P2P

Les API Wi-Fi P2P sont améliorées dans Android 4.1 pour permettre la découverte du service de pré-association dans le WifiP2pManager. Cela vous permet d'identifier et de filtrer les appareils à proximité en fonction des services utilisant le Wi-Fi P2P avant de vous y connecter, tandis que la détection de services réseau vous permet de découvrir un service sur un réseau connecté existant (tel qu'un réseau Wi-Fi local).

Pour diffuser votre application en tant que service via le Wi-Fi afin que d'autres appareils puissent la découvrir et s'y connecter, appelez addLocalService() avec un objet WifiP2pServiceInfo qui décrit vos services d'application.

Pour lancer la détection d'appareils à proximité via le Wi-Fi, vous devez d'abord décider si vous allez communiquer à l'aide de Bonjour ou d'Upnp. Pour utiliser Bonjour, commencez par configurer des écouteurs de rappel avec setDnsSdResponseListeners(), qui accepte à la fois WifiP2pManager.DnsSdServiceResponseListener et WifiP2pManager.DnsSdTxtRecordListener. Pour utiliser Upnp, appelez setUpnpServiceResponseListener(), qui accepte un WifiP2pManager.UpnpServiceResponseListener.

Pour pouvoir découvrir des services sur les appareils locaux, vous devez également appeler addServiceRequest(). Lorsque le WifiP2pManager.ActionListener que vous transmettez à cette méthode reçoit un rappel réussi, vous pouvez commencer à découvrir des services sur les appareils locaux en appelant discoverServices().

Lorsque des services locaux sont détectés, vous recevez un rappel vers WifiP2pManager.DnsSdServiceResponseListener ou WifiP2pManager.UpnpServiceResponseListener, selon que vous vous êtes enregistré pour utiliser Bonjour ou Upnp. Le rappel reçu dans les deux cas contient un objet WifiP2pDevice représentant l'appareil pair.

Utilisation du réseau

La nouvelle méthode isActiveNetworkMetered() vous permet de vérifier si l'appareil est actuellement connecté à un réseau facturé à l'usage. En vérifiant cet état avant d'effectuer des transactions réseau intensives, vous pouvez gérer la consommation de données qui peut coûter de l'argent à vos utilisateurs et prendre des décisions éclairées sur l'exécution des transactions immédiatement ou plus tard (par exemple, lorsque l'appareil se connecte au Wi-Fi).

Accessibilité

API des services d'accessibilité

La portée des API de services d'accessibilité a été considérablement accrue sous Android 4.1. Il vous permet désormais de créer des services qui surveillent davantage d'événements d'entrée et y répondent, tels que des gestes complexes à l'aide de onGesture() et d'autres événements d'entrée via des ajouts aux classes AccessibilityEvent, AccessibilityNodeInfo et AccessibilityRecord.

Les services d'accessibilité peuvent également effectuer des actions pour le compte de l'utilisateur, comme cliquer, faire défiler et parcourir du texte à l'aide de performAction et setMovementGranularities. La méthode performGlobalAction() permet également aux services d'effectuer des actions telles que "Retour" et "Accueil", et d'ouvrir les applications récentes et les notifications.

Navigation personnalisable dans l'application

Lorsque vous créez une application Android, vous pouvez désormais personnaliser les schémas de navigation en recherchant des éléments sélectionnables et des widgets d'entrée à l'aide de findFocus() et focusSearch(), et définir le ciblage à l'aide de setAccessibilityFocused().

Widgets plus accessibles

La nouvelle classe android.view.accessibility.AccessibilityNodeProvider vous permet de présenter des vues personnalisées complexes aux services d'accessibilité afin qu'ils puissent présenter les informations de manière plus accessible. android.view.accessibility.AccessibilityNodeProvider permet à un widget utilisateur avec du contenu avancé, tel qu'une grille d'agenda, de présenter une structure sémantique logique pour les services d'accessibilité complètement distincte de la structure de mise en page du widget. Cette structure sémantique permet aux services d'accessibilité de présenter un modèle d'interaction plus utile pour les utilisateurs déficients visuels.

Copy and Paste

Copier et coller avec des intents

Vous pouvez maintenant associer un objet ClipData à un Intent à l'aide de la méthode setClipData(). Cela est particulièrement utile lorsque vous utilisez un intent pour transférer plusieurs URI content: vers une autre application, par exemple lors du partage de plusieurs documents. Les URI content: fournis de cette manière respectent également les indicateurs de l'intent pour offrir un accès en lecture ou en écriture, ce qui vous permet d'accorder l'accès à plusieurs URI dans un intent. Lors du démarrage d'un intent ACTION_SEND ou ACTION_SEND_MULTIPLE, les URI fournis dans l'intent sont désormais automatiquement propagés à ClipData afin que le destinataire puisse y avoir accès.

Prise en charge des styles HTML et chaîne

La classe ClipData prend désormais en charge le texte stylisé (sous forme de chaînes avec styles HTML ou Android). Vous pouvez ajouter du texte avec style HTML au ClipData avec newHtmlText().

RenderScript

La fonctionnalité de calcul de Renderscript a été améliorée avec les fonctionnalités suivantes:

  • Prise en charge de plusieurs noyaux dans un même script.
  • Prise en charge de la lecture à partir de l'allocation avec des échantillonneurs filtrés du calcul dans une nouvelle API de script rsSample.
  • Prise en charge de différents niveaux de précision de FP dans #pragma.
  • Prise en charge de l'interrogation d'informations supplémentaires à partir d'objets RS à partir d'un script de calcul.
  • Nombreuses améliorations des performances.

De nouvelles pragmas sont également disponibles pour définir la précision à virgule flottante requise par vos Renderscripts de calcul. Cela vous permet d'activer des opérations de type NEON, telles que les opérations mathématiques vectorielles rapides, sur le chemin du processeur, ce qui ne serait pas possible autrement avec la norme IEEE 754-2008 complète.

Remarque:Le moteur graphique expérimental Renderscript est désormais obsolète.

Animation

Animations de lancement de l'activité

Vous pouvez désormais lancer un Activity à l'aide d'animations de zoom ou de vos propres animations personnalisées. Pour spécifier l'animation souhaitée, utilisez les API ActivityOptions pour créer un élément Bundle que vous pouvez ensuite transmettre à l'une des méthodes qui lancent une activité, par exemple startActivity().

La classe ActivityOptions inclut une méthode différente pour chaque type d'animation que vous souhaitez afficher à l'ouverture de votre activité:

makeScaleUpAnimation()
Crée une animation qui redimensionne la fenêtre d'activité à partir d'une position de départ spécifiée à l'écran et d'une taille de départ spécifiée. Par exemple, l'écran d'accueil d'Android 4.1 l'utilise à l'ouverture d'une application.
makeThumbnailScaleUpAnimation()
Crée une animation qui redimensionne la fenêtre d'activité à partir d'une position spécifiée et d'une vignette fournie. Par exemple, la fenêtre "Applications récentes" d'Android 4.1 l'utilise lorsque vous revenez à une application.
makeCustomAnimation()
Crée une animation définie par vos propres ressources: une qui définit l'animation à l'ouverture de l'activité et une autre à l'activité en cours d'arrêt.

Animateur de temps

Le nouveau TimeAnimator fournit un mécanisme de rappel simple avec le TimeAnimator.TimeListener qui vous avertit à chaque image de l'animation. Il n'y a pas de durée, d'interpolation ni de définition de valeur d'objet avec cet animateur. Le rappel de l'écouteur reçoit des informations pour chaque image, y compris le temps total écoulé et le temps écoulé depuis l'image d'animation précédente.

Interface utilisateur

Notifications

Dans Android 4.1, vous pouvez créer des notifications avec des régions de contenu plus grandes, de grands aperçus d'images, plusieurs boutons d'action et une priorité configurable.

Styles de notifications

La nouvelle méthode setStyle() vous permet de spécifier l'un des trois nouveaux styles de notification, chacun offrant une région de contenu plus grande. Pour spécifier le style de votre grande région de contenu, transmettez à setStyle() l'un des objets suivants:

Notification.BigPictureStyle
Pour les notifications qui incluent une grande image en pièce jointe.
Notification.BigTextStyle
Pour les notifications contenant beaucoup de texte (un seul e-mail, par exemple).
Notification.InboxStyle
Pour les notifications contenant une liste de chaînes, comme des extraits de plusieurs e-mails.
Actions de notification

Vous pouvez désormais afficher jusqu'à deux boutons d'action au bas du message de notification, que votre notification utilise le style normal ou plus grand.

Pour ajouter un bouton d'action, appelez addAction(). Cette méthode nécessite trois arguments: une ressource drawable pour une icône, du texte pour le bouton et un élément PendingIntent qui définit l'action à exécuter.

Priorités

Vous pouvez maintenant indiquer au système l'importance de votre notification pour influer sur son ordre dans la liste en définissant la priorité avec setPriority(). Vous pouvez transmettre l'un des cinq niveaux de priorité différents définis par les constantes PRIORITY_* dans la classe Notification. La valeur par défaut est PRIORITY_DEFAULT, et deux niveaux sont supérieurs et deux niveaux inférieurs.

Les notifications à priorité élevée sont des éléments auxquels les utilisateurs souhaitent généralement répondre rapidement, comme l'arrivée d'un nouveau message instantané, d'un SMS ou d'un rappel d'événement imminent. Les notifications à faible priorité sont des événements d'agenda arrivés à expiration ou des promotions d'applications.

Commandes pour l'UI du système

Android 4.0 (Ice Cream Sandwich) a ajouté de nouveaux indicateurs pour contrôler la visibilité des éléments de l'interface utilisateur du système, par exemple pour assombrir l'apparence de la barre système ou la faire disparaître complètement sur les téléphones. Android 4.1 ajoute quelques indicateurs supplémentaires qui vous permettent de contrôler davantage l'apparence des éléments d'UI du système et la mise en page de votre activité par rapport à ceux-ci en appelant setSystemUiVisibility() et en transmettant les indicateurs suivants:

SYSTEM_UI_FLAG_FULLSCREEN
Masque l'UI du système non critique (la barre d'état, par exemple). Si votre activité utilise la barre d'action en mode superposition (en activant android:windowActionBarOverlay), cet indicateur la masque également à l'aide d'une animation coordonnée, lorsque les deux sont masquées et affichées.
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
Définit la mise en page de votre activité pour qu'elle utilise la même zone d'écran que celle disponible lorsque vous avez activé SYSTEM_UI_FLAG_FULLSCREEN, même si les éléments de l'UI du système sont toujours visibles. Bien que certaines parties de votre mise en page soient superposées par l'UI du système, cela est utile si votre application masque et affiche souvent l'UI du système avec SYSTEM_UI_FLAG_FULLSCREEN, car cela évite que votre mise en page s'adapte aux nouvelles limites de mise en page chaque fois que l'UI du système est masquée ou affichée.
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
Définit la mise en page de votre activité pour qu'elle utilise la même zone d'écran que celle disponible lorsque vous avez activé SYSTEM_UI_FLAG_HIDE_NAVIGATION (ajoutée dans Android 4.0), même si les éléments d'UI du système sont toujours visibles. Bien que certaines parties de votre mise en page soient superposées par la barre de navigation, cela est utile si votre application masque et affiche souvent la barre de navigation avec SYSTEM_UI_FLAG_HIDE_NAVIGATION, car cela évite que votre mise en page s'adapte aux nouvelles limites de mise en page chaque fois que la barre de navigation est masquée ou affichée.
SYSTEM_UI_FLAG_LAYOUT_STABLE
Vous pouvez ajouter cette option si vous utilisez SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN et/ou SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION pour vous assurer que les limites définies restent cohérentes par rapport à l'espace d'écran disponible lorsque vous appelez fitSystemWindows() sur une vue. Autrement dit, lorsque cet indicateur est défini, fitSystemWindows() se comporte comme si la visibilité des éléments de l'UI du système restait inchangée, même après que vous ayez masqué toutes les interfaces utilisateur du système.

Pour en savoir plus sur les autres indicateurs d'interface utilisateur système associés, consultez ceux ajoutés dans Android 4.0.

Vues à distance

GridLayout et ViewStub sont désormais des vues rétractables, que vous pouvez utiliser dans les mises en page de vos widgets d'application et de vos mises en page personnalisées pour les notifications.

Familles de polices

Android 4.1 ajoute plusieurs variantes du style de police Roboto pour un total de 10 variantes. Toutes sont utilisables par les applications. Vos applications ont désormais accès à l'ensemble des variantes légères et condensées.

La liste complète des variantes de police Roboto est disponible:

  • Standard
  • Italique
  • Gras
  • Gras et italique
  • Faible
  • Clair italique
  • Normal condensé
  • Italique condensé
  • Gras condensé
  • Gras-italique condensé

Vous pouvez appliquer n'importe laquelle de ces méthodes avec le nouvel attribut fontFamily en combinaison avec l'attribut textStyle.

Les valeurs acceptées pour fontFamily sont les suivantes:

  • "sans-serif" pour la police Roboto standard
  • "sans-serif-light" pour Roboto Light
  • "sans-serif-condensed" pour Roboto Condensed

Vous pouvez ensuite mettre en gras et/ou en italique avec les valeurs textStyle, "bold" et "italic". Vous pouvez appliquer les deux comme suit: android:textStyle="bold|italic".

Vous pouvez également utiliser Typeface.create(). Par exemple, Typeface.create("sans-serif-light", Typeface.NORMAL).

Framework de saisie

Plusieurs périphériques d'entrée

La nouvelle classe InputManager vous permet d'interroger l'ensemble des périphériques d'entrée actuellement connectés et de s'enregistrer pour être averti lorsqu'un nouvel appareil est ajouté, modifié ou supprimé. Cela est particulièrement utile si vous développez un jeu acceptant plusieurs joueurs et que vous souhaitez détecter le nombre de manettes connectées et en cas de changement du nombre de manettes.

Vous pouvez interroger tous les périphériques d'entrée connectés en appelant getInputDeviceIds(). Cette opération renvoie un tableau d'entiers, chacun étant un ID correspondant à un périphérique d'entrée différent. Vous pouvez ensuite appeler getInputDevice() pour obtenir un InputDevice pour un ID de périphérique d'entrée spécifié.

Si vous souhaitez être informé lorsque de nouveaux périphériques d'entrée sont connectés, modifiés ou déconnectés, implémentez l'interface InputManager.InputDeviceListener et enregistrez-la avec registerInputDeviceListener().

Vibreur pour contrôleurs d'entrée

Si les périphériques d'entrée connectés disposent de leurs propres fonctionnalités de vibreur, vous pouvez désormais contrôler le vibreur de ces appareils à l'aide des API Vibrator existantes en appelant simplement getVibrator() sur le InputDevice.

Autorisations

Voici les nouvelles autorisations:

READ_EXTERNAL_STORAGE
Fournit un accès en lecture protégé à l'espace de stockage externe. Sous Android 4.1, par défaut, toutes les applications disposent toujours d'un accès en lecture. Ce paramètre sera modifié dans une prochaine version pour exiger que les applications demandent explicitement l'accès en lecture à l'aide de cette autorisation. Si votre application demande déjà un accès en écriture, elle obtient également automatiquement un accès en lecture. Une nouvelle option pour les développeurs permet d'activer la restriction d'accès en lecture afin qu'ils puissent tester leurs applications sur le comportement futur d'Android.
android.Manifest.permission.READ_USER_DICTIONAIRE
Permet à une application de lire le dictionnaire personnel. Cela ne devrait être requis que par un IME ou un éditeur de dictionnaire comme l'application Paramètres.
READ_CALL_LOG
Permet à une application de lire le journal d'appels du système contenant des informations sur les appels entrants et sortants.
WRITE_CALL_LOG
Permet à une application de modifier le journal d'appels du système stocké sur votre téléphone.
android.Manifest.permission.WRITE_USER_DICTIONARY
Permet à une application d'écrire dans le dictionnaire de mots de l'utilisateur.

Fonctionnalités de l'appareil

Android 4.1 inclut une nouvelle déclaration de fonctionnalité pour les appareils dédiés à l'affichage de l'interface utilisateur sur un téléviseur: FEATURE_TELEVISION. Pour déclarer que votre application nécessite une interface TV, déclarez cette fonctionnalité dans votre fichier manifeste avec l'élément <uses-feature>:

<manifest ... >
    <uses-feature android:name="android.hardware.type.television"
                  android:required="true" />
    ...
</manifest>

Cette fonctionnalité définit la "télévision" comme une expérience télévisuelle classique : elle s'affiche sur un grand écran, où l'utilisateur est assis à une certaine distance et où la forme d'entrée dominante est semblable à un pavé directionnel, et généralement pas à l'aide d'un écran tactile ou d'une souris/pointeur.