API Android 3.0

Niveau d'API:11

Pour les développeurs, la plate-forme Android 3.0 (HONEYCOMB) est disponible en tant que composant téléchargeable pour le SDK Android. La plate-forme téléchargeable comprend une bibliothèque Android et une image système, ainsi qu'un ensemble d'apparences d'émulateur et plus encore. La plate-forme téléchargeable n'inclut aucune bibliothèque externe.

Pour les développeurs, la plate-forme Android 3.0 est disponible en tant que composant téléchargeable pour le SDK Android. La plate-forme téléchargeable comprend une bibliothèque Android et une image système, ainsi qu'un ensemble d'apparences d'émulateur et plus encore. Pour commencer à développer ou à tester sous Android 3.0, utilisez Android SDK Manager afin de télécharger la plate-forme dans votre SDK.

Présentation de l'API

Les sections ci-dessous fournissent un aperçu technique des nouveautés pour les développeurs sous Android 3.0, y compris les nouvelles fonctionnalités et les modifications apportées à l'API de framework depuis la version précédente.

Fragments

Un fragment est un nouveau composant de framework qui vous permet de séparer les éléments distincts d'une activité en modules autonomes qui définissent leur propre interface utilisateur et leur propre cycle de vie. Pour créer un fragment, vous devez étendre la classe Fragment et implémenter plusieurs méthodes de rappel de cycle de vie, semblables à Activity. Vous pouvez ensuite combiner plusieurs fragments dans une même activité pour créer une interface utilisateur à plusieurs volets, dans laquelle chaque volet gère son propre cycle de vie et ses propres entrées utilisateur.

Vous pouvez également utiliser un fragment sans fournir d'interface utilisateur et l'utiliser à la place en tant que nœud de calcul pour l'activité, par exemple pour gérer la progression d'un téléchargement qui ne se produit que pendant l'exécution de l'activité.

De plus :

  • Les fragments sont autonomes et vous pouvez les réutiliser dans plusieurs activités.
  • Vous pouvez ajouter, supprimer, remplacer et animer des fragments dans l'activité
  • Vous pouvez ajouter des fragments à une pile "Retour" gérée par l'activité, en conservant l'état des fragments tels qu'ils sont modifiés et en permettant à l'utilisateur de revenir en arrière entre les différents états.
  • En fournissant d'autres mises en page, vous pouvez mélanger et faire correspondre des fragments en fonction de la taille et de l'orientation de l'écran.
  • Les fragments ont un accès direct à leur activité de conteneur et peuvent ajouter des éléments à la barre d'action de l'activité (décrite ci-dessous).

Pour gérer les fragments de votre activité, vous devez utiliser FragmentManager, qui fournit plusieurs API permettant d'interagir avec les fragments. Par exemple, vous pouvez rechercher des fragments dans l'activité et les extraire de la pile "Retour" pour restaurer leur état précédent.

Pour effectuer une transaction, par exemple ajouter ou supprimer un fragment, vous devez créer un FragmentTransaction. Vous pouvez ensuite appeler des méthodes telles que add(), remove() ou replace(). Une fois que vous avez appliqué toutes les modifications que vous souhaitez apporter à la transaction, vous devez appeler commit(). Le système applique alors la transaction de fragment à l'activité.

Pour en savoir plus sur l'utilisation des fragments, consultez la documentation sur les fragments. Plusieurs exemples sont également disponibles dans l'application Démonstrations d'API.

Barre d'action

La barre d'action remplace la barre de titre traditionnelle située en haut de la fenêtre d'activité. Elle inclut le logo de l'application dans le coin gauche et fournit une nouvelle interface pour les éléments du menu d'options. De plus, la barre d'actions vous permet:

  • Ajoutez des éléments de menu directement dans la barre d'action (en tant qu'actions).

    Dans votre déclaration XML pour l'élément de menu, incluez l'attribut android:showAsAction avec la valeur "ifRoom". Lorsque l'espace est suffisant, l'élément de menu apparaît directement dans la barre d'action. Sinon, l'élément est placé dans le menu à développer, révélé par l'icône de menu située à droite de la barre d'action.

  • Remplacez une action par un widget (un champ de recherche, par exemple) pour créer une "vue d'action".

    Dans la déclaration XML de l'élément de menu, ajoutez l'attribut android:actionViewLayout avec une ressource de mise en page ou l'attribut android:actionViewClass avec le nom de classe d'un widget. Vous devez également déclarer l'attribut android:showAsAction pour que l'élément apparaisse dans la barre d'action. Si l'espace est insuffisant dans la barre d'action et que l'élément apparaît dans le menu à développer, il se comporte comme un élément de menu standard et n'affiche pas le widget.

  • Ajouter une action au logo de l'application et le remplacer par un logo personnalisé

    Le logo de l'application reçoit automatiquement l'ID android.R.id.home, que le système envoie au rappel onOptionsItemSelected() de votre activité lorsque l'utilisateur appuie dessus. Il vous suffit de répondre à cet ID dans votre méthode de rappel pour effectuer une action (par exemple, accéder à l'activité d'accueil de votre application).

    Pour remplacer l'icône par un logo, spécifiez le logo de votre application dans le fichier manifeste avec l'attribut android:logo, puis appelez setDisplayUseLogoEnabled(true) dans votre activité.

  • Ajouter un fil d'Ariane pour parcourir la pile "Retour" des fragments
  • Ajoutez des onglets ou une liste déroulante pour parcourir les fragments
  • Personnalisez la barre d'action avec des thèmes et des arrière-plans

La barre d'action est standard pour toutes les applications qui utilisent le nouveau thème holographique, ce qui est également le cas lorsque vous définissez android:minSdkVersion ou android:targetSdkVersion sur "11".

Pour en savoir plus, consultez la documentation Barre d'actions. Plusieurs exemples sont également disponibles dans l'application Démonstrations d'API.

Presse-papiers du système

Les applications peuvent désormais copier et coller des données (au-delà du simple texte) vers et depuis le presse-papiers à l'échelle du système. Les données rognées peuvent être du texte brut, un URI ou un intent.

En fournissant au système l'accès aux données que vous souhaitez que l'utilisateur copie via un fournisseur de contenu, il peut copier du contenu complexe (tel qu'une image ou une structure de données) à partir de votre application et le coller dans une autre application compatible avec ce type de contenu.

Pour commencer à utiliser le presse-papiers, récupérez l'objet ClipboardManager global en appelant getSystemService(CLIPBOARD_SERVICE).

Pour copier un élément dans le presse-papiers, vous devez créer un objet ClipData, qui contient un ou plusieurs objets ClipData.Item décrivant chacun une seule entité. Pour créer un objet ClipData ne contenant qu'un seul ClipData.Item, vous pouvez utiliser l'une des méthodes d'assistance, telles que newPlainText(), newUri() et newIntent(), qui renvoient chacune un objet ClipData préchargé avec l'objet ClipData.Item que vous fournissez.

Pour ajouter le ClipData au presse-papiers, transmettez-le à setPrimaryClip() pour votre instance de ClipboardManager.

Vous pouvez ensuite lire un fichier à partir du presse-papiers (afin de le coller) en appelant getPrimaryClip() au niveau de ClipboardManager. Gérer le ClipData que vous recevez peut s'avérer compliqué. Vous devez vous assurer de pouvoir gérer le type de données figurant dans le presse-papiers avant d'essayer de le coller.

Le presse-papiers ne contient qu'une seule donnée rognée (un objet ClipData) à la fois, mais un élément ClipData peut contenir plusieurs éléments ClipData.Item.

Pour en savoir plus, consultez la documentation Copier et coller. Vous pouvez également voir une implémentation simple de copier-coller dans l'exemple de démonstration d'API et une implémentation plus complète dans l'exemple de Bloc-notes.

Glisser-déposer

Les nouvelles API simplifient les opérations de glisser-déposer dans l'interface utilisateur de votre application. Une opération de déplacement est le transfert de données stockées dans un objet ClipData d'un emplacement à un autre. Le point de départ et d'arrivée de l'opération de glisser-déposer est un View. Les API qui gèrent directement les opérations de glisser-déposer se trouvent dans la classe View.

Le cycle de vie d'une opération de glisser-déposer est défini par plusieurs actions de déplacement, chacune définie par un objet DragEvent, comme ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED et ACTION_DROP. Chaque vue qui souhaite participer à une opération de déplacement peut écouter ces actions.

Pour commencer à faire glisser du contenu dans votre activité, appelez startDrag() au niveau d'un View, en fournissant un objet ClipData qui représente les données à faire glisser, un View.DragShadowBuilder pour faciliter l'ombre que les utilisateurs voient sous leurs doigts pendant le déplacement et un Object qui peut partager des informations sur l'objet de déplacement avec des vues susceptibles de recevoir l'objet.

Pour accepter un objet "faire glisser" dans un View (recevoir la commande "drop"), enregistrez la vue avec un OnDragListener en appelant setOnDragListener(). Lorsqu'un événement de déplacement se produit sur la vue, le système appelle onDrag() pour OnDragListener, qui reçoit un DragEvent décrivant le type d'action de déplacement (par exemple ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED et ACTION_DROP). Pendant un déplacement, le système appelle à plusieurs reprises onDrag() pour la vue située sous le déplacement, afin de diffuser un flux d'événements de déplacement. La vue de réception peut demander le type d'événement envoyé à onDragEvent() en appelant getAction() sur DragEvent.

Remarque:Bien qu'un événement de déplacement puisse comporter un objet ClipData, cela n'est pas lié au presse-papiers du système. Une opération de glisser-déposer ne doit jamais placer les données déplacées dans le presse-papiers du système.

Pour en savoir plus, consultez la documentation sur le glisser-déposer. Vous pouvez également voir une implémentation du glisser-déposer dans les applications API Demos et Honeycomb Gallery.

Widgets d'application

Android 3.0 prend en charge plusieurs nouvelles classes de widgets pour des widgets d'application plus interactifs sur l'écran d'accueil des utilisateurs, y compris: GridView, ListView, StackView, ViewFlipper et AdapterViewFlipper.

Plus important encore, vous pouvez utiliser le nouveau RemoteViewsService pour créer des widgets d'application avec des collections, à l'aide de widgets tels que GridView, ListView et StackView qui s'appuient sur des données distantes, comme celles d'un fournisseur de contenu.

La classe AppWidgetProviderInfo (définie en XML avec un élément <appwidget-provider>) accepte également deux nouveaux champs: autoAdvanceViewId et previewImage. Le champ autoAdvanceViewId vous permet de spécifier l'ID de la vue de la sous-vue du widget d'application qui doit être avancée automatiquement par l'hôte du widget d'application. Le champ previewImage donne un aperçu du widget d'application. Il est présenté à l'utilisateur à partir du sélecteur de widgets. Si ce champ n'est pas renseigné, l'icône du widget d'application est utilisée pour l'aperçu.

Pour vous aider à créer une image d'aperçu pour votre widget d'application (à spécifier dans le champ previewImage), Android Emulator inclut une application appelée "Widget Preview". Pour créer une image d'aperçu, lancez cette application, sélectionnez son widget, configurez-le comme vous souhaitez que l'image d'aperçu s'affiche, puis enregistrez-la et placez-la dans les ressources drawable de votre application.

Vous pouvez voir une implémentation des nouvelles fonctionnalités de widget d'application dans les applications widget d'application StackView et widget de liste météo.

Notifications de la barre d'état

Les API Notification ont été étendues pour accepter davantage de notifications de barre d'état enrichies en contenu, et une nouvelle classe Notification.Builder vous permet de créer facilement des objets Notification.

Les nouveautés incluent les fonctionnalités suivantes :

  • Prise en charge d'une grande icône dans la notification, utilisant setLargeIcon(). C'est généralement le cas pour les applications de réseaux sociaux qui affichent la photo du contact de la personne à l'origine de la notification, ou pour les applications multimédias qui affichent une vignette d'album.
  • Prise en charge des mises en page personnalisées dans le bandeau de la barre d'état, avec setTicker().
  • Prise en charge des mises en page de notification personnalisées pour inclure des boutons avec des PendingIntents, pour des widgets de notification plus interactifs. Par exemple, une notification peut contrôler la lecture de musique sans démarrer d'activité.

Chargeurs de contenu

Les nouvelles API de framework facilitent le chargement asynchrone des données à l'aide de la classe Loader. Vous pouvez l'utiliser avec des composants d'interface utilisateur tels que des vues et des fragments pour charger dynamiquement des données à partir de threads de calcul. La sous-classe CursorLoader est spécialement conçue pour vous aider à le faire pour les données sauvegardées par un ContentProvider.

Il vous suffit d'implémenter l'interface LoaderCallbacks pour recevoir des rappels lorsqu'un nouveau chargeur est demandé ou que les données ont changé. Appelez ensuite initLoader() afin d'initialiser le chargeur pour votre activité ou fragment.

Pour en savoir plus, consultez la documentation sur les chargeurs. Vous pouvez également consulter des exemples de code utilisant des chargeurs dans les exemples LoaderCursor et LoaderThrottle.

Bluetooth A2DP et API casque

Android inclut désormais des API permettant aux applications de vérifier l'état des appareils de profil Bluetooth A2DP et casque connectés. Par exemple, les applications peuvent identifier lorsqu'un casque Bluetooth est connecté pour écouter de la musique et en informer l'utilisateur, le cas échéant. Les applications peuvent également recevoir des diffusions pour les commandes AT spécifiques du fournisseur et informer l'utilisateur de l'état de l'appareil connecté, par exemple lorsque la batterie de l'appareil connecté est faible.

Vous pouvez initialiser le BluetoothProfile correspondant en appelant getProfileProxy() avec la constante de profil A2DP ou HEADSET et un BluetoothProfile.ServiceListener pour recevoir des rappels lorsque le client Bluetooth est connecté ou déconnecté.

Framework d'animation

Un tout nouveau framework d'animation flexible vous permet d'animer les propriétés arbitraires de n'importe quel objet (vue, drawable, fragment, objet ou tout autre élément). Il vous permet de définir plusieurs aspects d'une animation, tels que:

  • Durée
  • Quantité répétée et comportement
  • Type d'interpolation temporelle
  • Ensembles d'animateurs permettant de lire les animations ensemble, de manière séquentielle ou après des délais spécifiés
  • Délai d'actualisation des images

Vous pouvez définir par défaut ces aspects d'animation, ainsi que d'autres, pour les valeurs de couleur int, float et hexadécimales d'un objet. Autrement dit, lorsqu'un objet possède un champ de propriété pour l'un de ces types, vous pouvez modifier sa valeur au fil du temps pour affecter une animation. Pour animer tout autre type de valeur, vous indiquez au système comment calculer les valeurs pour ce type donné, en implémentant l'interface TypeEvaluator.

Vous pouvez utiliser deux animateurs pour animer les valeurs d'une propriété: ValueAnimator et ObjectAnimator. ValueAnimator calcule les valeurs de l'animation, mais ne connaît pas l'objet ou la propriété spécifique qui en résulte. Il effectue simplement les calculs, et vous devez écouter les mises à jour et traiter les données avec votre propre logique. ObjectAnimator est une sous-classe de ValueAnimator. Elle vous permet de définir l'objet et la propriété à animer, et gère toute la tâche d'animation. Autrement dit, vous donnez à ObjectAnimator l'objet à animer, la propriété de l'objet à modifier au fil du temps et un ensemble de valeurs à appliquer à la propriété au fil du temps, puis vous lancez l'animation.

En outre, la classe LayoutTransition active des animations de transition automatiques pour les modifications que vous apportez à la mise en page de votre activité. Pour activer les transitions dans une partie de la mise en page, créez un objet LayoutTransition et définissez-le sur n'importe quel ViewGroup en appelant setLayoutTransition(). Cela entraîne l'exécution d'animations par défaut chaque fois que des éléments sont ajoutés au groupe ou supprimés de celui-ci. Pour spécifier des animations personnalisées, appelez setAnimator() sur LayoutTransition et fournissez un Animator personnalisé, tel qu'un ValueAnimator ou un ObjectAnimator mentionné ci-dessus.

Pour en savoir plus, consultez la documentation sur l'animation des propriétés. Vous pouvez également consulter plusieurs exemples d'utilisation des API d'animation dans l'application API Demos.

Framework d'interface utilisateur étendue

  • Sélection à choix multiples pour ListView et GridView

    Le nouveau mode CHOICE_MODE_MULTIPLE_MODAL pour setChoiceMode() permet aux utilisateurs de sélectionner plusieurs éléments à partir d'une ListView ou d'une GridView. Lorsqu'elle est utilisée conjointement avec la barre d'action, les utilisateurs peuvent sélectionner plusieurs éléments, puis sélectionner l'action à effectuer à partir d'une liste d'options dans la barre d'action (qui est devenue un mode d'action à choix multiples).

    Pour activer la sélection à choix multiples, appelez setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL) et enregistrez un MultiChoiceModeListener avec setMultiChoiceModeListener().

    Lorsque l'utilisateur appuie de manière prolongée sur un élément, la barre d'action passe en mode d'action à choix multiples. Le système avertit MultiChoiceModeListener lorsque des éléments sont sélectionnés en appelant onItemCheckedStateChanged().

    Pour obtenir un exemple de sélection à choix multiples, consultez la classe List15.java dans l'exemple d'application API Demos.

  • Nouvelles API pour transformer les vues

    Les nouvelles API vous permettent d'appliquer facilement des transformations 2D et 3D aux vues de la mise en page de vos activités. De nouvelles transformations sont possibles avec un ensemble de propriétés d'objet qui définissent la position de la mise en page, l'orientation, la transparence et plus encore.

    Les nouvelles méthodes permettant de définir les propriétés de la vue sont les suivantes: setAlpha(), setBottom(), setLeft(), setRight(), setBottom(), setPivotX(), setPivotY(), setRotationX(), setRotationY(), setScaleX(), setScaleY(), setAlpha(), etc.

    Certaines méthodes disposent également d'un attribut XML correspondant que vous pouvez spécifier dans votre fichier de mise en page pour appliquer une transformation par défaut. Les attributs disponibles sont les suivants: translationX, translationY, rotation, rotationX, rotationY, scaleX, scaleY, transformPivotX, transformPivotY et alpha.

    En utilisant certaines de ces nouvelles propriétés de vue en combinaison avec le nouveau framework d'animation (décrit ci-dessus), vous pouvez facilement appliquer des animations originales à vos vues. Par exemple, pour faire pivoter une vue sur son axe des ordonnées, indiquez à ObjectAnimator la propriété View, la propriété "rotationY", ainsi que les valeurs de début et de fin:

    Kotlin

    ObjectAnimator.ofFloat(myView, "rotationY", 0f, 360f).apply {
        duration = 2000
        start()
    }
    

    Java

    ObjectAnimator animator = ObjectAnimator.ofFloat(myView, "rotationY", 0, 360);
    animator.setDuration(2000);
    animator.start();
    
  • Nouveaux thèmes holographiques

    Les widgets système standards et l'apparence générale ont été repensés et incorporent un nouveau thème d'interface utilisateur "holographique". Le système applique le nouveau thème à l'aide du système standard de style et de thème.

    Toute application qui cible la plate-forme Android 3.0 (en définissant la valeur android:minSdkVersion ou android:targetSdkVersion sur "11") hérite par défaut du thème holographique. Toutefois, si votre application applique également son propre thème, celui-ci remplacera le thème holographique, sauf si vous mettez à jour vos styles pour qu'ils héritent du thème holographique.

    Pour appliquer le thème holographique à des activités individuelles ou pour en hériter dans vos propres définitions de thème, utilisez l'un des nouveaux thèmes Theme.Holo. Si votre application est compatible avec une version d'Android antérieure à 3.0 et qu'elle applique des thèmes personnalisés, vous devez sélectionner un thème basé sur la version de la plate-forme.

  • Nouveaux widgets
    • AdapterViewAnimator

      Classe de base d'un AdapterView qui exécute des animations lors du passage d'une vue à l'autre.

    • AdapterViewFlipper

      ViewAnimator simple qui s'anime entre au moins deux vues qui y ont été ajoutées. Un seul enfant est affiché à la fois. Si nécessaire, elle peut basculer automatiquement entre chaque enfant à intervalles réguliers.

    • CalendarView

      Permet aux utilisateurs de sélectionner des dates dans un calendrier en appuyant sur la date, et de faire défiler le calendrier ou de le déplacer vers la date souhaitée. Vous pouvez configurer la période disponible dans le widget.

    • ListPopupWindow

      S'ancre à une vue hôte et affiche une liste d'options, par exemple une liste de suggestions lors de la saisie dans une vue EditText.

    • NumberPicker

      Permet à l'utilisateur de sélectionner un nombre dans une plage prédéfinie. Le widget comporte un champ de saisie ainsi que des boutons haut et bas permettant de sélectionner un nombre. Le fait d'appuyer sur le champ de saisie permet à l'utilisateur de faire défiler les valeurs ou d'appuyer à nouveau pour modifier directement la valeur actuelle. Cela vous permet également de mapper des positions à des chaînes afin que la chaîne correspondante s'affiche à la place de la position d'index.

    • PopupMenu

      Affiche un Menu dans une fenêtre pop-up modale ancrée à une vue. Le pop-up s'affiche sous la vue ancrée s'il y a de la place, ou au-dessus dans le cas contraire. Si l'IME (clavier virtuel) est visible, la fenêtre pop-up ne chevauche pas l'IME tant que l'utilisateur n'a pas appuyé sur le menu.

    • SearchView

      Fournit un champ de recherche que vous pouvez configurer pour envoyer des requêtes de recherche à une activité spécifiée et afficher des suggestions de recherche (de la même manière que la boîte de dialogue de recherche traditionnelle). Ce widget est particulièrement utile pour proposer un widget de recherche dans la barre d'action. Pour en savoir plus, consultez la page Créer une interface de recherche.

    • StackView

      Une vue qui affiche ses enfants dans une pile 3D et permet aux utilisateurs de les parcourir comme un rolodex.

Graphismes

  • Accélération matérielle des graphismes 2D

    Vous pouvez maintenant activer le moteur de rendu OpenGL pour votre application en définissant android:hardwareAccelerated="true" dans l'élément <application> de votre élément manifeste ou pour des éléments <activity> individuels.

    Cet indicateur aide les applications en les rendant plus rapides. Cela se traduit par des animations et un défilement plus fluides, ainsi que par de meilleures performances globales et une meilleure réponse à l'interaction de l'utilisateur.

  • Découvrez la compatibilité des couches matérielles et logicielles.

    Par défaut, aucun calque n'est spécifié pour View. Vous pouvez spécifier que la vue repose sur une couche matérielle ou logicielle, spécifiée par les valeurs LAYER_TYPE_HARDWARE et LAYER_TYPE_SOFTWARE, à l'aide de setLayerType() ou de l'attribut layerType.

    Une couche matérielle repose sur une texture spécifique au matériel (généralement des objets de tampon de trame ou FBO sur le matériel OpenGL) et entraîne l'affichage de la vue à l'aide du pipeline de rendu matériel Android, mais uniquement si l'accélération matérielle est activée pour la hiérarchie des vues. Lorsque l'accélération matérielle est désactivée, les couches matérielles se comportent exactement comme des couches logicielles.

    Une couche logicielle repose sur un bitmap et entraîne l'affichage de la vue à l'aide du pipeline de rendu logiciel d'Android, même si l'accélération matérielle est activée. Il est important d'éviter les couches logicielles lorsque l'arborescence de vue concernée est souvent mise à jour. Chaque mise à jour nécessite un nouveau rendu de la couche logicielle, ce qui peut potentiellement être lent.

    Pour en savoir plus, consultez la documentation LAYER_TYPE_HARDWARE et LAYER_TYPE_SOFTWARE.

  • Moteur graphique 3D Renderscript

    Renderscript est un framework 3D d'exécution qui fournit à la fois une API pour créer des scènes 3D, ainsi qu'un langage de nuanceur spécial indépendant de la plate-forme, pour des performances optimales. Renderscript vous permet d'accélérer les opérations graphiques et le traitement des données. Renderscript est un moyen idéal de créer des effets 3D hautes performances pour les applications, les fonds d'écran, les carrousels, etc.

    Pour en savoir plus, consultez la documentation Rendu et calcul 3D avec Renderscript.

Contenus multimédias

  • Vidéo en accéléré

    Les API Camcorder prennent désormais en charge l'enregistrement de vidéos en accéléré. Le setCaptureRate() définit la fréquence à laquelle les images doivent être capturées.

  • Compatibilité des textures pour les flux d'images

    Le nouveau SurfaceTexture vous permet de capturer un flux d'images en tant que texture OpenGL ES. En appelant setPreviewTexture() pour votre instance Camera, vous pouvez spécifier le SurfaceTexture sur lequel dessiner la lecture vidéo ou prévisualiser les images de l'appareil photo.

  • Streaming en direct via HTTP

    Les applications peuvent désormais transmettre une URL de playlist M3U au framework multimédia pour démarrer une session de streaming HTTP en direct. Le framework multimédia est compatible avec la plupart des spécifications de streaming HTTP Live Streaming, y compris le débit adaptatif. Pour en savoir plus, consultez le document Formats multimédias acceptés.

  • Données EXIF

    ExifInterface inclut de nouveaux champs pour l'ouverture, l'ISO et la durée d'exposition de la photo.

  • Profils de caméscope

    La nouvelle méthode hasProfile() et plusieurs profils de qualité vidéo (tels que QUALITY_1080P, QUALITY_720P, QUALITY_CIF, etc.) vous permettent de déterminer les options de qualité du caméscope.

  • Transfert de fichiers multimédias numériques

    La plate-forme est compatible avec le protocole MTP/PTP (Media/Picture Transfer Protocol) via USB, ce qui permet aux utilisateurs de transférer facilement tout type de fichiers multimédias entre des appareils et un ordinateur hôte. Les développeurs peuvent s'appuyer sur cette compatibilité pour créer des applications qui permettent aux utilisateurs de créer ou de gérer des fichiers rich media qu'ils souhaitent transférer ou partager entre différents appareils.

  • Gestion des droits numériques (DRM)

    Nouveau framework de gestion extensible des droits numériques (DRM) pour vérifier et appliquer les droits numériques Il est mis en œuvre dans deux couches architecturales:

    • Une API de framework DRM, exposée aux applications et qui s'exécute via la VM Dalvik pour les applications standards.
    • Un gestionnaire DRM de code natif qui implémente l'API de framework et expose une interface pour les plug-ins DRM, afin de gérer la gestion et le déchiffrement des droits pour différents schémas DRM.

    Pour les développeurs d'applications, le framework propose une API abstraite et unifiée qui simplifie la gestion du contenu protégé. L'API masque la complexité des opérations DRM et permet un mode de fonctionnement cohérent pour le contenu protégé et non protégé, et pour divers schémas DRM.

    Pour les fabricants d'appareils, les propriétaires de contenu et les fournisseurs de médias numériques Internet, l'API de plug-in du framework DRM permet d'ajouter la prise en charge d'un schéma DRM de choix au système Android, afin d'appliquer de manière sécurisée la protection du contenu.

    La version preview ne fournit pas de plug-ins DRM natifs permettant de vérifier et d'appliquer les droits numériques. Toutefois, les fabricants d'appareils peuvent fournir des plug-ins DRM avec leurs appareils.

    Toutes les API DRM sont disponibles dans le package android.drm.

Compatibilité avec les claviers

  • Prise en charge des modificateurs Ctrl, Meta, Verr Maj, Verr Num et Verr défilement. Pour en savoir plus, consultez META_CTRL_ON et les champs associés.
  • Compatibilité avec les claviers de bureau complets, avec la prise en charge de touches telles que Échap, Accueil, Fin, Suppr, etc. Vous pouvez déterminer si les événements de touche proviennent d'un clavier complet en interrogeant getKeyboardType() et en recherchant KeyCharacterMap.FULL.
  • TextView prend désormais en charge les options "Couper", "Copier", "Coller" et "Tout sélectionner" à l'aide des combinaisons de touches Ctrl+X, Ctrl+C, Ctrl+V et Ctrl+A. Il est également compatible avec les options Page précédente/Page suivante, Accueil/Fin et la sélection de texte au clavier.
  • KeyEvent ajoute plusieurs méthodes pour faciliter la vérification correcte et cohérente de l'état du modificateur de touche. Voir hasModifiers(int), hasNoModifiers(), metaStateHasModifiers() et metaStateHasNoModifiers().
  • Les applications peuvent implémenter les raccourcis clavier personnalisés en sous-classant Activity, Dialog ou View et en implémentant onKeyShortcut(). Le framework appelle cette méthode chaque fois qu'une touche est combinée à une touche Ctrl. Lorsque vous créez un menu d'options, vous pouvez enregistrer des raccourcis clavier en définissant l'attribut android:alphabeticShortcut ou android:numericShortcut pour chaque élément <item> (ou avec setShortcut()).
  • Android 3.0 inclut un nouveau "clavier virtuel" associé à l'ID KeyCharacterMap.VIRTUAL_KEYBOARD. Le clavier virtuel dispose d'un mappage de touches US de style ordinateur de bureau qui est utile pour synthétiser les événements de touche afin de tester l'entrée.

Événements tactiles fractionnés

Auparavant, les événements tactiles ne pouvaient être enregistrés que dans une seule vue à la fois. Android 3.0 prend en charge la division des événements tactiles entre les vues et même les fenêtres, de sorte que différentes vues peuvent accepter des événements tactiles simultanés.

Les événements tactiles fractionnés sont activés par défaut lorsqu'une application cible Android 3.0. Autrement dit, lorsque l'application a défini la valeur de l'attribut android:minSdkVersion ou android:targetSdkVersion sur "11".

Toutefois, les propriétés suivantes vous permettent de désactiver les événements tactiles fractionnés dans les vues au sein de groupes de vues spécifiques et entre les fenêtres.

  • L'attribut android:splitMotionEvents des groupes de vues vous permet de désactiver les événements tactiles fractionnés qui se produisent entre les vues enfants d'une mise en page. Exemple :
    <LinearLayout android:splitMotionEvents="false" ... >
        ...
    </LinearLayout>
    

    De cette façon, les vues enfants dans la mise en page linéaire ne peuvent pas diviser les événements tactiles. Une seule vue peut recevoir des événements tactiles à la fois.

  • La propriété de style android:windowEnableSplitTouch vous permet de désactiver les événements tactiles fractionnés dans les fenêtres, en les appliquant à un thème pour l'activité ou l'ensemble de l'application. Exemple :
    <style name="NoSplitMotionEvents" parent="android:Theme.Holo">
        <item name="android:windowEnableSplitTouch">false</item>
        ...
    </style>
    

    Lorsque ce thème est appliqué à un <activity> ou à un <application>, seuls les événements tactiles de la fenêtre d'activité actuelle sont acceptés. Par exemple, en désactivant les événements tactiles fractionnés dans les fenêtres, la barre système ne peut pas recevoir d'événements tactiles en même temps que l'activité. Cela n'affecte pas la possibilité pour les vues de l'activité de fractionner les événements tactiles. Par défaut, l'activité peut toujours fractionner les événements tactiles sur plusieurs vues.

    Pour en savoir plus sur la création d'un thème, consultez Appliquer des styles et des thèmes.

WebKit

  • Nouvelle classe WebViewFragment pour créer un fragment composé d'un WebView.
  • Nouvelles méthodes WebSettings :
    • setDisplayZoomControls() vous permet de masquer les commandes de zoom à l'écran tout en permettant à l'utilisateur de zoomer avec des doigts (setBuiltInZoomControls() doit être défini sur true).
    • La nouvelle méthode WebSettings, setEnableSmoothTransition(), vous permet d'assurer des transitions fluides lors des panoramiques et des zooms. Lorsque cette option est activée, WebView choisit une solution pour maximiser les performances (par exemple, le contenu de la WebView peut ne pas être mis à jour pendant la transition).
  • Nouvelles méthodes WebView :
    • Un rappel onPause() pour suspendre tout traitement associé à la WebView lorsqu'elle est masquée. Cela permet de réduire le trafic inutile du processeur ou du réseau lorsque la WebView n'est pas au premier plan.
    • Un rappel onResume() pour reprendre le traitement associé à la WebView, qui a été suspendu pendant onPause().
    • saveWebArchive() vous permet d'enregistrer la vue actuelle en tant qu'archive Web sur l'appareil.
    • showFindDialog() lance une recherche de texte dans la vue actuelle.

Browser

Le navigateur ajoute les fonctionnalités suivantes pour prendre en charge les applications Web:

  • Capture multimédia

    Comme défini par la spécification HTML Media Capture, le navigateur autorise les applications Web à accéder aux fonctionnalités de capture audio, d'image et de vidéo de l'appareil. Par exemple, le code HTML suivant fournit à l'utilisateur une entrée pour prendre une photo à importer:

    <input type="file" accept="image/*;capture=camera" />
    

    Sinon, en excluant le paramètre capture=camera, l'utilisateur peut choisir de capturer une nouvelle image avec l'appareil photo ou d'en sélectionner une sur l'appareil (par exemple, dans l'application Galerie).

  • Orientation de l'appareil

    Comme défini par la spécification Device Orientation Event (Événement d'orientation de l'appareil), le navigateur permet aux applications Web d'écouter des événements DOM qui fournissent des informations sur l'orientation physique et les mouvements de l'appareil.

    L'orientation de l'appareil est exprimée en degrés avec les axes x, y et z, et le mouvement est exprimé à l'aide des données d'accélération et de taux de rotation. Une page Web peut s'inscrire aux événements d'orientation en appelant window.addEventListener avec le type d'événement "deviceorientation" et s'inscrire aux événements de mouvement en enregistrant le type d'événement "devicemotion".

  • Transformations 3D CSS

    Comme défini par la spécification du module CSS 3D Transform, le navigateur autorise la transformation en trois dimensions des éléments rendus par CSS.

Utilitaires JSON

Les nouvelles classes, JsonReader et JsonWriter, vous aident à lire et à écrire des flux JSON. Les nouvelles API complètent les classes org.json, qui manipulent un document en mémoire.

Vous pouvez créer une instance de JsonReader en appelant sa méthode constructeur et en transmettant le InputStreamReader qui alimente la chaîne JSON. Commencez ensuite à lire un objet en appelant beginObject(), lisez un nom de clé avec nextName(), lisez la valeur à l'aide de méthodes spécifiques au type, telles que nextString() et nextInt(), et continuez à le faire tant que hasNext() est défini sur "true".

Vous pouvez créer une instance de JsonWriter en appelant son constructeur et en transmettant le OutputStreamWriter approprié. Écrivez ensuite les données JSON de la même manière que pour le lecteur, en utilisant name() pour ajouter un nom de propriété et une méthode value() appropriée pour ajouter la valeur correspondante.

Ces classes sont strictes par défaut. La méthode setLenient() de chaque classe les configure de manière plus libérale en ce qu'elles acceptent. Ce mode d'analyse indulgent est également compatible avec l'analyseur par défaut de org.json.

Nouvelles constantes de caractéristiques

L'élément <uses-feature> doit être utilisé pour informer les entités externes (telles que Google Play) de l'ensemble des fonctionnalités matérielles et logicielles dont dépend votre application. Dans cette version, Android ajoute les nouvelles constantes suivantes, que les applications peuvent déclarer avec cet élément:

  • "android.hardware.faketouch"

    Lorsqu'elle est déclarée, cela indique que l'application est compatible avec un appareil qui propose un écran tactile émulé (ou mieux). Un appareil doté d'un écran tactile émulé fournit un système de saisie utilisateur capable d'émuler un sous-ensemble de fonctionnalités de l'écran tactile. Une souris ou une télécommande qui pilote un curseur à l'écran constituent un exemple de ce type de système de saisie. Ces systèmes de saisie prennent en charge les événements tactiles de base tels que le clic vers le bas, le clic vers le haut et le déplacement. Toutefois, les types d'entrée plus complexes (tels que les gestes, les glissements d'un geste vif, etc.) peuvent s'avérer plus difficiles, voire impossibles, sur les appareils tactiles factices (et les gestes à plusieurs doigts ne sont absolument pas possibles).

    Si votre application ne nécessite pas de gestes complexes et que vous ne souhaitez pas qu'elle soit filtrée pour les appareils équipés d'un écran tactile émulé, vous devez déclarer "android.hardware.faketouch" avec un élément <uses-feature>. De cette façon, votre application sera disponible pour le plus grand nombre de types d'appareils, y compris ceux qui ne fournissent qu'une entrée tactile émulée.

    Tous les appareils qui incluent un écran tactile sont également compatibles avec "android.hardware.faketouch", car les fonctionnalités d'écran tactile constituent un sur-ensemble de fonctionnalités tactiles factices. Ainsi, à moins que vous n'ayez réellement besoin d'un écran tactile, vous devez ajouter un élément <uses-feature> pour les interactions tactiles.

Nouvelles autorisations

  • "android.permission.BIND_REMOTEVIEWS"

    Pour une implémentation de RemoteViewsService, vous devez déclarer cette autorisation dans l'élément du fichier manifeste <service>. Par exemple, lorsque vous créez un widget d'application qui utilise RemoteViewsService pour remplir une vue de collection, l'entrée du fichier manifeste peut se présenter comme suit:

    <service android:name=".widget.WidgetService"
        android:exported="false"
        android:permission="android.permission.BIND_REMOTEVIEWS" />
    

Nouvelles technologies de plate-forme

  • Stockage
    • Prise en charge du système de fichiers ext4 pour activer le stockage eMMC intégré.
    • FUSE pour prendre en charge les appareils MTP.
    • Compatibilité avec le mode hôte USB, compatible avec les claviers et les hubs USB.
    • Compatibilité avec MTP/PTP
  • Linux Kernel
    • Mise à niveau vers la version 2.6.36
  • VM Dalvik
    • Nouveau code pour prendre en charge et optimiser la plate-forme SMP
    • Diverses améliorations apportées à l'infrastructure JIT
    • Améliorations apportées au récupérateur de mémoire :
      • Réglé pour le SMP
      • Compatibilité avec des tailles de tas de mémoire plus importantes
      • Gestion unifiée des bitmaps et des tampons d'octets
  • Bibliothèques Dalvik Core
    • Nouvelle implémentation beaucoup plus rapide de NIO (bibliothèque d'E/S moderne)
    • Amélioration des messages d'exception
    • Correction d'erreurs et de performances sur l'ensemble du site

Rapport sur les différences entre les API

Pour obtenir une vue détaillée de toutes les modifications apportées à l'API dans Android 3.0 (niveau d'API 11), consultez le rapport sur les différences entre les API.

Niveau d'API

La plate-forme Android 3.0 fournit une version mise à jour de l'API du framework. Un identifiant entier (11) est attribué à l'API Android 3.0, qui est stocké dans le système lui-même. Cet identifiant, appelé "niveau d'API", permet au système de déterminer correctement si une application est compatible avec le système, avant de l'installer.

Pour utiliser les API introduites dans Android 3.0 dans votre application, vous devez compiler l'application avec la bibliothèque Android fournie dans la plate-forme SDK Android 3.0. En fonction de vos besoins, vous devrez peut-être également ajouter un attribut android:minSdkVersion="11" à l'élément <uses-sdk> dans le fichier manifeste de l'application. Si votre application est conçue pour ne s'exécuter que sur Android 2.3 ou version ultérieure, déclarer l'attribut empêche son installation sur les versions antérieures de la plate-forme.

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