Welcome to the Android 14 Developer Preview! Please give us your feedback, and help us make Android 14 the best release yet.

Features and APIs Overview

Stay organized with collections Save and categorize content based on your preferences.

Android 14 introduces great new features and APIs for developers. The sections below help you learn about features for your apps and get started with the related APIs.

For a detailed list of new, modified, and removed APIs, read the API diff report. For details on new APIs visit the Android API reference — new APIs are highlighted for visibility. Also, to learn about areas where platform changes may affect your apps, be sure to check out Android 14 behavior changes for apps that target Android 14 and for all apps.

Internationalization

Per-app language preferences

Android 14 expands on the per-app language features that were introduced in Android 13 (API level 33) with these additional capabilities:

  • Dynamic updates for an app's localeConfig: Use the setOverrideLocaleConfig() and getOverrideLocaleConfig() methods in LocaleManager to dynamically update your app's list of supported languages in the device's system settings. Use this flexibility to customize the list of supported languages per region, run A/B experiments, or provide an updated list of locales if your app utilizes server-side pushes for localization.

  • App language visibility for input method editors (IMEs): IMEs can utilize the getApplicationLocales() method to check the language of the current app and match the IME language to that language.

Grammatical Inflection API

The Grammatical Inflection API allows you to more easily add support for users who speak languages where grammatical gender changes the sentence based on the person being addressed, providing a more personalized and natural-sounding user experience for those languages.

Example of inflection for grammatical gender

Grammatical gender is integral to some languages and can't be easily worked around like in English. For example, in English to write a message telling the user that they are subscribed to your app's service, you could use a single phrase: "You are subscribed to...".

To provide a similar phrase in French, there are a few options:

  • Masculine-inflected form: "Vous êtes abonné à..." (English: "You are subscribed to...")
  • Feminine-inflected form: "Vous êtes abonnée à…" (English: "You are subscribed to...")
  • Neutral phrasing that avoids inflection: "Abonnement à…activé" (English: "Subscription to ... enabled")

Similar to English, the first two options address the user directly. However, without any mechanism to accommodate this grammatical feature of French, you would only have the third option, which changes the tone of the message and might not be what you want to display in your user interface.

In these cases, the Grammatical Inflection API lowers the effort to display strings relative to the viewer's grammatical gender—that is, the person who's viewing the UI, not who's being talked about. To show users personalized translations in your app, add translations that are inflected for each grammatical gender for affected languages and then use the GrammaticalInflectionManager API to adjust which translations are shown to each user.

Previously, to add similiar support, you would need to use the SelectFormat API from the International Components for Unicode (ICU), which must be applied on a per-string basis.

Add translations for languages with grammatical gender

To provide localized text for languages with grammatical gender, create an alternative resources file and append the grammatical gender qualifer immediately after the locale name for those languages. The following table outlines the possible values:

Qualifier String value Example (French fr)
Feminine feminine res/values-fr-feminine/strings.xml
Masculine masculine res/values-fr-masculine/strings.xml
Neuter neuter res/values-fr-neuter/strings.xml

You should only include strings that support grammatical gender inflections in these resources files. Include other strings in the default resource file that contains other localized strings and the default translation will be shown whenever a grammatical-gendered version is not available. In the example provided for French earlier, the neutral phrasing would be the value of the string in the default resources res/values-fr/strings.xml file.

Accessibility

Non-linear font scaling to 200%

Starting in Android 14, the system supports font scaling up to 200%, providing low-vision users with additional accessibility options that align with Web Content Accessibility Guidelines (WCAG).

To prevent large text elements on screen from scaling too large, the system applies a non-linear scaling curve. This scaling strategy means that large text doesn't scale at the same rate as smaller text. Non-linear font scaling helps preserve the proportional hierachy between elements of different sizes while mitigating issues with linear text scaling at high degrees (such as text being cut off or text that becomes harder to read due to an extremely large display sizes).

Test your app with non-linear font scaling

Enable the maximum font size in a device's accessibility settings to test your app.

If you already use scaled pixels (sp) units to define text sizing, then these additional options and scaling improvements will be applied automaticaly to the text in your app. However, you should still perform UI testing with the maximum font size enabled (200%) to ensure that your app applies the font sizes correctly and can accommodate larger font sizes without impacting usability.

To enable 200% font size, follow these steps:

  1. Open the Settings app and navigate to Accessibility > Display size and text.
  2. For the Font size option, tap the plus (+) icon until the maximum font size setting is enabled, as shown in the image that accompanies this section.

Use scaled pixel (sp) units for text-sizes

Remember to always specify text sizes in sp units. When your app uses sp units, Android can apply the the user's preferred text size and scale it appropriately.

Do not use sp units for padding or view heights: with non-linear font scaling sp dimensions might not be proportional, so 4sp + 20sp might not equal 24sp.

Convert scaled pixel (sp) units

Use TypedValue.applyDimension() to convert from sp units to pixels, and use TypedValue.deriveDimension() to convert pixels to sp. These methods apply the appropriate non-linear scaling curve automatically.

Avoid hardcoding equations using Configuration.fontScale or DisplayMetrics.scaledDensity. Because font scaling is now non-linear, these fields are no longer accurate.