סקירה כללית על תכונות וממשקי API

ב-Android 15 יש תכונות וממשקי API נהדרים למפתחים. בקטעים הבאים מפורט סיכום של התכונות האלה, כדי לעזור לכם להתחיל להשתמש בממשקי ה-API הרלוונטיים.

רשימה מפורטת של ממשקי ה-API שנוספו, שונו והוסרו מופיעה בדוח ההבדלים של ממשקי ה-API. לפרטים על ממשקי API שנוספו, אפשר לעיין בחומר העזר בנושא Android API. לגבי Android 15, מחפשים ממשקי API שנוספו ברמת API 35. כדי לקבל מידע על תחומים שבהם שינויים בפלטפורמה עשויים להשפיע על האפליקציות שלכם, כדאי לעיין בשינויים בהתנהגות של Android 15 באפליקציות שמטרגטות את Android 15 ובכל האפליקציות.

מצלמה ומדיה

Android 15 כולל מגוון תכונות לשיפור חוויית השימוש במצלמה ובמדיה, ומעניק גישה לכלים ולחומרה שיעזרו ליוצרי תוכן להגשים את החזון שלהם ב-Android.

מידע נוסף על התכונות והפתרונות העדכניים ביותר למפתחים למדיה ולמצלמה ב-Android זמין בהרצאה יצירת חוויות מודרניות של מדיה ומצלמה ב-Android מ-Google I/O.

הגברת התאורה החלשה

Android 15 introduces Low Light Boost, an auto-exposure mode available to both Camera 2 and the night mode camera extension. Low Light Boost adjusts the exposure of the Preview stream in low-light conditions. This is different from how the night mode camera extension creates still images, because night mode combines a burst of photos to create a single, enhanced image. While night mode works very well for creating a still image, it can't create a continuous stream of frames, but Low Light Boost can. Thus, Low Light Boost enables camera capabilities, such as:

  • Providing an enhanced image preview, so users are better able to frame their low-light pictures
  • Scanning QR codes in low light

If you enable Low Light Boost, it automatically turns on when there's a low light level, and turns off when there's more light.

Apps can record off the Preview stream in low-light conditions to save a brightened video.

For more information, see Low Light Boost.

אמצעי בקרה למצלמה באפליקציה

Android 15 adds an extension for more control over the camera hardware and its algorithms on supported devices:

  • Advanced flash strength adjustments enabling precise control of flash intensity in both SINGLE and TORCH modes while capturing images.

בקרת מרווח ביטחון ל-HDR

Android 15 chooses HDR headroom that is appropriate for the underlying device capabilities and bit-depth of the panel. For pages that have lots of SDR content, such as a messaging app displaying a single HDR thumbnail, this behavior can end up adversely influencing the perceived brightness of the SDR content. Android 15 lets you control the HDR headroom with setDesiredHdrHeadroom to strike a balance between SDR and HDR content.

The brightness of SDR UI elements on the left screen appears to be more uniform than the brightness on the right screen, which simulates possible headroom issues when HDR and SDR content are mixed. By adjusting the HDR headroom, you can achieve a better balance between the SDR and HDR content.

בקרת עוצמת הקול

ב-Android 15 יש תמיכה בתקן עוצמת הקול CTA-2075, כדי למנוע אי-עקביות בעוצמת האודיו ולוודא שהמשתמשים לא יצטרכו לשנות את עוצמת הקול כל הזמן כשהם עוברים בין תכנים. המערכת משתמשת במאפיינים ידועים של התקני הפלט (אוזניות ורמקול) יחד עם מטא-נתונים של עוצמת קול שזמינים בתוכן אודיו בפורמט AAC, כדי לשנות בצורה חכמה את עוצמת הקול ואת רמות הדחיסה של טווח הדינמיקה של האודיו.

כדי להפעיל את התכונה הזו, צריך לוודא שהמטא-נתונים של עוצמת הקול זמינים את תוכן ה-AAC ולהפעיל את תכונת הפלטפורמה באפליקציה. כדי לעשות את זה, ליצור אובייקט LoudnessCodecController באמצעות קוראים לו ליצור שיטת יצרן עם האודיו מזהה סשן מ-AudioTrack המשויך. הזה החלת עדכוני אודיו תופעל באופן אוטומטי. אפשר להעביר OnLoudnessCodecUpdateListener כדי לשנות או לסנן את הפרמטרים של עוצמת הקול לפני שהם מוחלים MediaCodec

// Media contains metadata of type MPEG_4 OR MPEG_D
val mediaCodec = 
val audioTrack = AudioTrack.Builder()
                                .setSessionId(sessionId)
                                .build()
...
// Create new loudness controller that applies the parameters to the MediaCodec
try {
   val lcController = LoudnessCodecController.create(mSessionId)
   // Starts applying audio updates for each added MediaCodec
}

גם AndroidX media3 ExoPlayer יתעדכן כך שישתמש בממשקי ה-API של LoudnessCodecController לשילוב חלק של האפליקציות.

מכשירי MIDI 2.0 וירטואליים

Android 13 added support for connecting to MIDI 2.0 devices using USB, which communicate using Universal MIDI Packets (UMP). Android 15 extends UMP support to virtual MIDI apps, enabling composition apps to control synthesizer apps as a virtual MIDI 2.0 device just like they would with an USB MIDI 2.0 device.

פענוח יעיל יותר של קוד AV1 בתוכנה

dav1d logo

dav1d, the popular AV1 software decoder from VideoLAN is available for Android devices that don't support AV1 decode in hardware. dav1d is up to 3x more performant than the legacy AV1 software decoder, enabling HD AV1 playback for more users, including some low and mid tier devices.

Your app needs to opt-in to using dav1d by invoking it by name "c2.android.av1-dav1d.decoder". dav1d will be made the default AV1 software decoder in a subsequent update. This support is standardized and backported to Android 11 devices that receive Google Play system updates.

כלים ודרכים לשיפור הפרודוקטיביות של מפתחים

רוב העבודה שלנו לשיפור הפרודוקטיביות מתמקדת בכלים כמו Android Studio,‏ Jetpack Compose וספריות Android Jetpack, אבל אנחנו תמיד מחפשים דרכים בפלטפורמה שיעזרו לכם להגשים את החזון שלכם בקלות רבה יותר.

עדכונים של OpenJDK 17

Android 15 continues the work of refreshing Android's core libraries to align with the features in the latest OpenJDK LTS releases.

The following key features and improvements are included:

These APIs are updated on over a billion devices running Android 12 (API level 31) and higher through Google Play System updates, so you can target the latest programming features.

שיפורים בקובצי PDF

Android 15 כולל שיפורים משמעותיים בPdfRenderer ממשקי API. אפליקציות יכולות לכלול תכונות מתקדמות כמו עיבוד קבצים שמוגנים באמצעות סיסמה, הערות, עריכת טפסים, חיפוש ובחירה עם העתקה. יש תמיכה באופטימיזציה של קובצי PDF ליניאריים כדי לזרז את הצפייה ב-PDF מקומי ולצמצם את השימוש במשאבים. אנחנו משתמשים בממשקי ה-API האלה בספריית ה-PDF של Jetpack כדי להוסיף קובצי PDF בקלות רבה יותר יכולות צפייה באפליקציה שלך.

העדכונים האחרונים לעיבוד קובצי PDF כוללים תכונות כמו חיפוש בקובץ PDF מוטמע.

PdfRenderer הועבר למודול שאפשר לעדכן באמצעות עדכוני המערכת של Google Play, ללא קשר למהדורת הפלטפורמה. כדי לתמוך בשינויים האלה ב-Android 11 (רמת API ‏30), יצרנו גרסה תואמת של ממשק ה-API שתוכננה ל-Android 15 ואילך, שנקראת PdfRendererPreV.

שיפורים בהחלפת השפה באופן אוטומטי

Android 14 added on-device, multi-language recognition in audio with automatic switching between languages, but this can cause words to get dropped, especially when languages switch with less of a pause between the two utterances. Android 15 adds additional controls to help apps tune this switching to their use case. EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS confines the automatic switching to the beginning of the audio session, while EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES deactivates the language switching after a defined number of switches. These options are particularly useful if you expect that there will be a single language spoken during the session that should be autodetected.

שיפורים ב-OpenType Variable Font API

ב-Android 15 שיפרנו את נוחות השימוש בגופן המשתנה OpenType. מעכשיו אפשר ליצור מופע של FontFamily מגופן משתנה בלי לציין הצירים במשקל עם ה-API של buildVariableFamily. כלי לרינדור הטקסט מבטל את ברירת המחדל הערך של ציר wght שיתאים לטקסט המוצג.

באמצעות ממשק ה-API החדש, הקוד ליצירת Typeface פשוט יותר. במידה רבה:

Kotlin

val newTypeface = Typeface.CustomFallbackBuilder(
            FontFamily.Builder(
                Font.Builder(assets, "RobotoFlex.ttf").build())
                    .buildVariableFamily())
    .build()

Java

Typeface newTypeface = Typeface.CustomFallbackBuilder(
            new FontFamily.Builder(
                new Font.Builder(assets, "RobotoFlex.ttf").build())
                    .buildVariableFamily())
    .build();

בעבר, כדי ליצור את אותו Typeface, היה צורך בהרבה יותר קוד:

Kotlin

val oldTypeface = Typeface.CustomFallbackBuilder(
            FontFamily.Builder(
                Font.Builder(assets, "RobotoFlex.ttf")
                    .setFontVariationSettings("'wght' 400")
                    .setWeight(400)
                    .build())
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 100")
                        .setWeight(100)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 200")
                        .setWeight(200)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 300")
                        .setWeight(300)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 500")
                        .setWeight(500)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 600")
                        .setWeight(600)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 700")
                        .setWeight(700)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 800")
                        .setWeight(800)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 900")
                        .setWeight(900)
                        .build()
                ).build()
        ).build()

Java

Typeface oldTypeface = new Typeface.CustomFallbackBuilder(
    new FontFamily.Builder(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 400")
            .setWeight(400)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 100")
            .setWeight(100)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 200")
            .setWeight(200)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 300")
            .setWeight(300)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 500")
            .setWeight(500)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 600")
            .setWeight(600)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 700")
            .setWeight(700)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 800")
            .setWeight(800)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 900")
            .setWeight(900)
            .build()
    )
    .build()
).build();

דוגמה לאופן שבו Typeface נוצר באמצעות ממשק ה-API הישן וגם באמצעות ממשק ה-API החדש מעבדים:

דוגמה להבדלים ברינדור גופנים בגרסה החדשה והישן
ממשקי API

בדוגמה הזו, ה-Typeface שנוצר באמצעות ה-API הישן לא כולל את יכולת ליצור משקלים מדויקים של גופנים עבור 350, 450, 550 ו-650 מופעים של Font, כך שהכלי לרינדור חוזר למשקל הקרוב ביותר. אז ב- במקרה הזה, מגרסת 300 מעובדת במקום 350, מתודה 400 מעובדת במקום 450, וכן הלאה. לעומת זאת, ה-Typeface שנוצר באמצעות ממשקי ה-API החדשים יוצר באופן דינמי. את המכונה Font למשקל נתון, כך שהתוצאה המדויקת של משקולות היא 350, 450, 550 ו-650.

אמצעי בקרה מפורטים למעברי שורה

החל מגרסה 15 של Android, האפשרות TextView והתכונה הבסיסית של הפסקת שורה יכולות לשמור על החלק הנתון של הטקסט באותה שורה כדי לשפר את הקריאוּת. כדי לנצל את ההתאמה האישית של הפסקות השורות, אפשר להשתמש בתג <nobreak> במשאבי מחרוזות או ב-createNoBreakSpan. באופן דומה, אפשר למנוע הוספת מקפים במילים באמצעות התג <nohyphen> או createNoHyphenationSpan.

לדוגמה, משאב המחרוזת הבא לא כולל מעבר שורה, והוא מוצג עם הטקסט "Pixel 8 Pro" במקום לא רצוי:

<resources>
    <string name="pixel8pro">The power and brains behind Pixel 8 Pro.</string>
</resources>

לעומת זאת, משאב המחרוזת הזה כולל את התג <nobreak>, שמקיף את הביטוי 'Pixel 8 Pro' ומונע הפסקות שורה:

<resources>
    <string name="pixel8pro">The power and brains behind <nobreak>Pixel 8 Pro.</nobreak></string>
</resources>

ההבדל באופן שבו מעיינים את המחרוזות האלה מוצג בתמונות הבאות:

פריסה של שורת טקסט שבה הביטוי "Pixel 8 Pro" לא מוקף בתג <nobreak>.
פריסה לאותה שורת טקסט שבה הביטוי "Pixel 8 Pro" מוקף בתג <nobreak>.

העברת אפליקציות לארכיון

השנה הודענו על תמיכה ב-Android וב-Google Play בהעברת אפליקציות לארכיון, כדי לאפשר למשתמשים לפנות מקום במכשיר על ידי הסרה חלקית של אפליקציות שהם משתמשים בהן לעיתים רחוקות, ופורסמו באמצעות Android App Bundle ב-Google Play. Android 15 כולל תמיכה ברמת מערכת ההפעלה בהעברה של אפליקציות לארכיון ובביטול ההעברה שלהן לארכיון, כך שקל יותר לכל חנויות האפליקציות להטמיע את התכונה הזו.

אפליקציות עם ההרשאה REQUEST_DELETE_PACKAGES יכולות לקרוא ל השיטה PackageInstaller requestArchive כדי לבקש העברה לארכיון חבילת אפליקציה מותקנת, שמסירה את ה-APK וכל הקבצים שנשמרו במטמון, אבל ממשיכה נתוני משתמש. אפליקציות שהועברו לארכיון מוחזרות כאפליקציות שניתנות להצגה דרך ממשקי ה-API של LauncherApps. המשתמשים יראו שינוי בממשק המשתמש כדי להדגיש שהאפליקציות האלה הועברו לארכיון. אם משתמש מקיש על אפליקציה שהועברה לארכיון, מנהל ההתקנה האחראי הוא זה יקבל בקשה לאחזר אותו מהארכיון, ותהליך השחזור יכול נמצאים במעקב של ACTION_PACKAGE_ADDED.

גרפיקה

ב-Android 15 יש את השיפורים האחרונים בתחום הגרפיקה, כולל ANGLE ותוספות למערכת הגרפיקה של Canvas.

מודרניזציה של הגישה ל-GPU ב-Android

Vulkan logo

Android hardware has evolved quite a bit from the early days where the core OS would run on a single CPU and GPUs were accessed using APIs based on fixed-function pipelines. The Vulkan® graphics API has been available in the NDK since Android 7.0 (API level 24) with a lower-level abstraction that better reflects modern GPU hardware, scales better to support multiple CPU cores, and offers reduced CPU driver overhead — leading to improved app performance. Vulkan is supported by all modern game engines.

Vulkan is Android's preferred interface to the GPU. Therefore, Android 15 includes ANGLE as an optional layer for running OpenGL® ES on top of Vulkan. Moving to ANGLE will standardize the Android OpenGL implementation for improved compatibility, and, in some cases, improved performance. You can test out your OpenGL ES app stability and performance with ANGLE by enabling the developer option in Settings -> System -> Developer Options -> Experimental: Enable ANGLE on Android 15.

The Android ANGLE on Vulkan roadmap

Roadmap of upcoming changes to the Android GPU APIs.

As part of streamlining our GPU stack, going forward we will be shipping ANGLE as the GL system driver on more new devices, with the future expectation that OpenGL/ES will be only available through ANGLE. That being said, we plan to continue support for OpenGL ES on all devices.

Recommended next steps

Use the developer options to select the ANGLE driver for OpenGL ES and test your app. For new projects, we strongly encourage using Vulkan for C/C++.

שיפורים ב-Canvas

Android 15 continues our modernization of Android's Canvas graphics system with additional capabilities:

  • Matrix44 provides a 4x4 matrix for transforming coordinates that should be used when you want to manipulate the canvas in 3D.
  • clipShader intersects the current clip with the specified shader, while clipOutShader sets the clip to the difference of the current clip and the shader, each treating the shader as an alpha mask. This supports the drawing of complex shapes efficiently.

ביצועים וסוללה

אנחנו ב-Android ממשיכים להתמקד בשיפור הביצועים והאיכות של האפליקציות שלכם. ב-Android 15 נוספו ממשקי API שיעזרו לכם לבצע משימות באפליקציה בצורה יעילה יותר, לבצע אופטימיזציה של ביצועי האפליקציה ולקבל תובנות על האפליקציות שלכם.

כדי לקבל שיטות מומלצות לחיסכון בסוללה, ניפוי באגים של שימוש ברשת ובחשמל ופירוט על האופן שבו אנחנו משפרים את יעילות השימוש בסוללה של משימות ברקע ב-Android 15 ובגרסאות האחרונות של Android, כדאי לצפות בהרצאה שיפור יעילות השימוש בסוללה של משימות ברקע ב-Android מ-Google I/O.

ApplicationStartInfo API

In previous versions of Android, app startup has been a bit of a mystery. It was challenging to determine within your app whether it started from a cold, warm, or hot state. It was also difficult to know how long your app spent during the various launch phases: forking the process, calling onCreate, drawing the first frame, and more. When your Application class was instantiated, you had no way of knowing whether the app started from a broadcast, a content provider, a job, a backup, boot complete, an alarm, or an Activity.

The ApplicationStartInfo API on Android 15 provides all of this and more. You can even choose to add your own timestamps into the flow to help collect timing data in one place. In addition to collecting metrics, you can use ApplicationStartInfo to help directly optimize app startup; for example, you can eliminate the costly instantiation of UI-related libraries within your Application class when your app is starting up due to a broadcast.

מידע מפורט על גודל האפליקציה

Since Android 8.0 (API level 26), Android has included the StorageStats.getAppBytes API that summarizes the installed size of an app as a single number of bytes, which is a sum of the APK size, the size of files extracted from the APK, and files that were generated on the device such as ahead-of-time (AOT) compiled code. This number is not very insightful in terms of how your app is using storage.

Android 15 adds the StorageStats.getAppBytesByDataType([type]) API, which lets you get insight into how your app is using up all that space, including APK file splits, AOT and speedup related code, dex metadata, libraries, and guided profiles.

יצירת פרופילים בניהול האפליקציה

מערכת Android 15 כוללת את הכיתה ProfilingManager, שמאפשרת לאסוף מידע על פרופיל האפליקציה, כמו דיווחים על אשכול, פרופילים של אשכול, דגימות מ-stack ועוד. הוא מספק קריאה חוזרת לאפליקציה עם תג שסופק כדי לזהות את קובץ הפלט, שמועבר לספריית הקבצים של האפליקציה. ממשק ה-API מגביל את קצב הבקשות כדי למזער את ההשפעה על הביצועים.

כדי לפשט את תהליך היצירה של בקשות ליצירת פרופילים באפליקציה, מומלץ להשתמש ב-Profiling AndroidX API המתאים, שזמין ב-Core 1.15.0-rc01 ואילך.

שיפורים במסד הנתונים של SQLite

ב-Android 15 נוספו ממשקי API של SQLite שמציגים תכונות מתקדמות מהמנוע הבסיסי של SQLite, שמטרגטות בעיות ספציפיות בביצועים שעשויות להתרחש באפליקציות. ממשקי ה-API האלה כלולים בעדכון של SQLite לגרסה 3.44.3.

מומלץ למפתחים לעיין בשיטות מומלצות לביצועי SQLite להפיק את המרב ממסד הנתונים של SQLite, במיוחד כשעובדים עם מסדי נתונים או כשמריצים שאילתות רגישות לזמן אחזור.

  • עסקאות מושהות לקריאה בלבד: כשאתם מנפיקים עסקאות לקריאה בלבד (לא כוללות הצהרות כתיבה), השתמשו ב-beginTransactionReadOnly() וב-beginTransactionWithListenerReadOnly(SQLiteTransactionListener) כדי להנפיק עסקאות DEFERRED לקריאה בלבד. עסקאות כאלה יכולות לפעול בו-זמנית זו עם זו, ואם מסד הנתונים נמצא במצב WAL, הן יכולות לפעול בו-זמנית עם עסקאות IMMEDIATE או EXCLUSIVE.
  • מספרים ומזהים של שורות: נוספו ממשקי API לאחזור מספר השורות שהשתנו או מזהה השורה האחרונה שהוכנסה, בלי להפעיל שאילתה נוספת. הפונקציה getLastChangedRowCount() מחזירה את מספר השורות שנוספו, עודכנו או נמחקו באמצעות הצהרת ה-SQL האחרונה בעסקה הנוכחית, בזמן ש-getTotalChangedRowCount() מחזירה את הספירה בחיבור הנוכחי. הפונקציה getLastInsertRowId() מחזירה את הערך rowid של השורה האחרונה. יוכנס לחיבור הנוכחי.
  • הצהרות גולמיות: הוצאת הצהרת SQlite גולמית, תוך עקיפת מעטפות נוחות וכל עלות עיבוד נוספת שעשויה להיגרם כתוצאה מהן.

עדכונים של Android Dynamic Performance Framework

Android 15 continues our investment in the Android Dynamic Performance Framework (ADPF), a set of APIs that allow games and performance intensive apps to interact more directly with power and thermal systems of Android devices. On supported devices, Android 15 adds ADPF capabilities:

  • A power-efficiency mode for hint sessions to indicate that their associated threads should prefer power saving over performance, great for long-running background workloads.
  • GPU and CPU work durations can both be reported in hint sessions, allowing the system to adjust CPU and GPU frequencies together to best meet workload demands.
  • Thermal headroom thresholds to interpret possible thermal throttling status based on headroom prediction.

To learn more about how to use ADPF in your apps and games, head over to the documentation.

פרטיות

Android 15 כולל מגוון תכונות שיעזרו למפתחי אפליקציות להגן על הפרטיות של המשתמשים.

זיהוי הקלטת מסך

במערכת Android 15 נוספה תמיכה באפליקציות כדי לזהות הן מתועדות. קריאה חוזרת (callback) מופעלת בכל פעם שהאפליקציה עוברת ממצב גלוי למצב מוסתר במהלך הקלטת מסך. אפליקציה היא נחשב כגלוי אם פעילויות שנמצאות בבעלות ה-UID של תהליך הרישום מוקלטת. כך, אם האפליקציה מבצעת פעולה רגישה, יכול ליידע את המשתמש על כך שהוא מוקלט.

val mCallback = Consumer<Int> { state ->
  if (state == SCREEN_RECORDING_STATE_VISIBLE) {
    // We're being recorded
  } else {
    // We're not being recorded
  }
}

override fun onStart() {
   super.onStart()
   val initialState =
      windowManager.addScreenRecordingCallback(mainExecutor, mCallback)
   mCallback.accept(initialState)
}

override fun onStop() {
    super.onStop()
    windowManager.removeScreenRecordingCallback(mCallback)
}

יכולות מורחבות של IntentFilter

ב-Android 15 יש תמיכה בפתרון מדויק יותר של Intent באמצעות UriRelativeFilterGroup, שמכיל קבוצה של אובייקטים מסוג UriRelativeFilter שמרכיבים קבוצה של כללי התאמה ל-Intent, שכל אחד מהם חייב להתקיים, כולל פרמטרים של שאילתה לגבי כתובת URL, קטעי כתובת URL וכללי חסימה או החרגה.

אפשר להגדיר את הכללים האלה בקובץ ה-XML AndroidManifest באמצעות התג <uri-relative-filter-group>, שיכול לכלול גם תג android:allow. התגים האלה יכולים להכיל תגי <data> שמשתמשים במאפיינים של תגי נתונים קיימים, וגם במאפיינים android:query ו-android:fragment.

דוגמה לסינטקס של AndroidManifest:

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.BROWSABLE" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="http" />
  <data android:scheme="https" />
  <data android:domain="astore.com" />
  <uri-relative-filter-group>
    <data android:pathPrefix="/auth" />
    <data android:query="region=na" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:pathPrefix="/auth" />
    <data android:query="mobileoptout=true" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:pathPrefix="/auth" />
    <data android:fragmentPrefix="faq" />
  </uri-relative-filter-group>
</intent-filter>

המרחב הפרטי

אפשר לבטל את הנעילה של המרחב הפרטי ולנעול אותו כדי להציג או להסתיר אותו לאפליקציות רגישות במכשיר.

המרחב הפרטי מאפשר למשתמשים ליצור מרחב נפרד במכשיר שלהם שבו הם יוכלו להרחיק אפליקציות רגישות מעיניים זרות, מתחת לשכבה נוספת של אימות. למרחב הפרטי יש פרופיל משתמש נפרד. המשתמש יכול לבחור להשתמש בנעילת המכשיר או בגורם נעילה נפרד עבור המרחב הפרטי.

אפליקציות במרחב הפרטי מופיעות בקונטיינר נפרד במרכז האפליקציות, וגם מוסתרים מתצוגת הפריטים האחרונים, מההודעות, מההגדרות ומאפליקציות אחרות כשהמרחב הפרטי נעול. תוכן שנוצר על ידי משתמשים ותוכן שהורד (כמו מדיה או קבצים) וחשבונות מופרדים בין המרחב הפרטי המרחב הראשי. גיליון השיתוף של המערכת אפשר להשתמש בכלי לבחירת תמונות כדי לתת לאפליקציות גישה לתוכן במרחבים המשותפים האלה כשהמרחב הפרטי פתוח.

המשתמשים לא יכולים להעביר אפליקציות קיימות ואת הנתונים שלהן למרחב הפרטי. במקום זאת, משתמשים בוחרים אפשרות התקנה במרחב הפרטי כדי להתקין אפליקציה באמצעות בכל חנות אפליקציות שהם מעדיפים. אפליקציות במרחב הפרטי מותקנות בתור עותקים נפרדים מכל אפליקציה במרחב הראשי (עותקים חדשים של אותה אפליקציה).

כשמשתמש נועל את המרחב הפרטי, הפרופיל מופסק. כשהפרופיל הופסק, אפליקציות במרחב הפרטי לא פעילות יותר ולא ניתן לבצע אותן פעילויות בחזית או ברקע, כולל הצגת התראות.

מומלץ לבדוק את האפליקציה באמצעות המרחב הפרטי כדי לוודא פועלת כצפוי, במיוחד אם האפליקציה שלך מסווגת לאחת מהאפשרויות הבאות קטגוריות:

שאילתה לגבי הבחירה האחרונה של המשתמש לגישה לתמונות שנבחרו

עכשיו אפליקציות יכולות להדגיש רק את התמונות האחרונות שנבחרו וסרטונים כשמעניקים גישה חלקית להרשאות מדיה. הזה יכולה לשפר את חוויית המשתמש באפליקציות שמבקשות לעיתים קרובות גישה לתמונות ולסרטונים. כדי להשתמש בתכונה הזו באפליקציה שלכם, צריך להפעיל את הארגומנט QUERY_ARG_LATEST_SELECTION_ONLY בעת שליחת שאילתה על MediaStore עד ContentResolver.

Kotlin

val externalContentUri = MediaStore.Files.getContentUri("external")

val mediaColumns = arrayOf(
   FileColumns._ID,
   FileColumns.DISPLAY_NAME,
   FileColumns.MIME_TYPE,
)

val queryArgs = bundleOf(
   // Return only items from the last selection (selected photos access)
   QUERY_ARG_LATEST_SELECTION_ONLY to true,
   // Sort returned items chronologically based on when they were added to the device's storage
   QUERY_ARG_SQL_SORT_ORDER to "${FileColumns.DATE_ADDED} DESC",
   QUERY_ARG_SQL_SELECTION to "${FileColumns.MEDIA_TYPE} = ? OR ${FileColumns.MEDIA_TYPE} = ?",
   QUERY_ARG_SQL_SELECTION_ARGS to arrayOf(
       FileColumns.MEDIA_TYPE_IMAGE.toString(),
       FileColumns.MEDIA_TYPE_VIDEO.toString()
   )
)

Java

Uri externalContentUri = MediaStore.Files.getContentUri("external");

String[] mediaColumns = {
    FileColumns._ID,
    FileColumns.DISPLAY_NAME,
    FileColumns.MIME_TYPE
};

Bundle queryArgs = new Bundle();
queryArgs.putBoolean(MediaStore.QUERY_ARG_LATEST_SELECTION_ONLY, true);
queryArgs.putString(MediaStore.QUERY_ARG_SQL_SORT_ORDER, FileColumns.DATE_ADDED + " DESC");
queryArgs.putString(MediaStore.QUERY_ARG_SQL_SELECTION, FileColumns.MEDIA_TYPE + " = ? OR " + FileColumns.MEDIA_TYPE + " = ?");
queryArgs.putStringArray(MediaStore.QUERY_ARG_SQL_SELECTION_ARGS, new String[] {
    String.valueOf(FileColumns.MEDIA_TYPE_IMAGE),
    String.valueOf(FileColumns.MEDIA_TYPE_VIDEO)
});

ארגז החול לפרטיות ב-Android

Android 15 includes the latest Android Ad Services extensions, incorporating the latest version of the Privacy Sandbox on Android. This addition is part of our work to develop technologies that improve user privacy and enable effective, personalized advertising experiences for mobile apps. Our privacy sandbox page has more information about the Privacy Sandbox on Android developer preview and beta programs to help you get started.

Health Connect

ב-Android 15 משולבים התוספים העדכניים ביותר של Health Connect by Android, פלטפורמה מאובטחת ומרכזית לניהול ולשיתוף של נתוני בריאות וכושר שנאספים באפליקציות. העדכון הזה מוסיף תמיכה בסוגי נתונים נוספים בנושאי כושר, תזונה, טמפרטורת העור, תוכניות אימון ועוד.

מעקב אחרי טמפרטורת העור מאפשר למשתמשים לאחסן ולשתף נתוני טמפרטורה מדויקים יותר ממכשיר לבישה או ממכשיר מעקב אחר פעילות אחר.

תוכניות אימונים הן תוכניות אימונים מובנות שיעזרו למשתמש להשיג את יעדי הכושר שלו. תוכניות האימונים כוללות תמיכה במגוון מטרות להשגה וביעדי ביצועים:

מידע נוסף על העדכונים האחרונים של Health Connect ב-Android זמין יצירת חוויות שניתנות להתאמה עם Android שיחות בתחום הבריאות מ-Google I/O.

שיתוף מסך של אפליקציה

Android 15 תומך בשיתוף מסך של אפליקציה, כך שמשתמשים יכולים לשתף או להקליט רק חלון של אפליקציה במקום את כל מסך המכשיר. התכונה הזו, שהופעל לראשונה ב-Android 14 QPR2, כוללת קריאות חזרה מסוג MediaProjection שמאפשרות לאפליקציה להתאים אישית את חוויית שיתוף המסך שלה. חשוב לזכור שבאפליקציות שמטרגטות ל-Android 14 (רמת API ‏34) ואילך, נדרשת הסכמה מהמשתמשים לכל סשן צילום של MediaProjection.

חוויית משתמש וממשק המשתמש של המערכת

Android 15 מעניק למפתחי אפליקציות ולמשתמשים יותר שליטה וגמישות בהגדרת המכשיר בהתאם לצרכים שלהם.

כדי ללמוד איך להשתמש בשיפורים האחרונים ב-Android 15 כדי לשפר את חוויית המשתמש באפליקציה, כדאי לצפות בהרצאה שיפור חוויית המשתמש באפליקציה ל-Android מוועידת Google I/O.

תצוגות מקדימות עשירות יותר של ווידג'טים באמצעות Generated Previews API

לפני Android 15, הדרך היחידה לספק תצוגות מקדימות של בורר הווידג'טים הייתה לציין משאב תמונה או פריסה סטטי. לרוב, התצוגות המקדימות האלה שונות באופן משמעותי מהמראה של הווידג'ט בפועל כשממקמים אותו במסך הבית. בנוסף, אי אפשר ליצור משאבים סטטיים באמצעות Jetpack Glance, ולכן מפתחי Glance נאלצו לצלם את הווידג'ט שלהם או ליצור פריסה של XML כדי להציג תצוגה מקדימה של הווידג'ט.

ב-Android 15 נוספה תמיכה בתצוגות מקדימות שנוצרו. המשמעות היא שספקי ווידג'טים של אפליקציות יכולים ליצור את RemoteViews כדי להשתמש בו בתצוגה המקדימה של הבורר, במקום משאב סטטי.

אפליקציות יכולות לספק תצוגות מרחוק לבורר הווידג'טים, כדי לעדכן את התוכן בבורר כך שייצג בצורה טובה יותר את מה שהמשתמשים יראו.

Push API

אפליקציות יכולות לספק תצוגות מקדימות שנוצרו באמצעות API לדחיפה. אפליקציות יכולות לספק תצוגות מקדימות בכל שלב במחזור החיים שלהן, והן לא מקבלות בקשה מפורשת מהמארח לספק תצוגות מקדימות. התצוגות המקדימות נשמרות ב-AppWidgetService, והמארחים יכולים לבקש אותן על פי דרישה. בדוגמה הבאה נטען משאב של פריסה של ווידג'ט בפורמט XML, והוא מוגדר כקטע המקדים:

AppWidgetManager.getInstance(appContext).setWidgetPreview(
   ComponentName(
       appContext,
       SociaLiteAppWidgetReceiver::class.java
   ),
   AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN,
   RemoteViews("com.example", R.layout.widget_preview)
)

התהליך הצפוי הוא:

  1. ספק הווידג'ט יכול לבצע קריאה ל-setWidgetPreview בכל שלב. התצוגות המקדימות שסיפקתם נשמרות ב-AppWidgetService עם פרטי ספק אחרים.
  2. setWidgetPreview תודיע למארחים על תצוגה מקדימה מעודכנת באמצעות קריאה חוזרת (callback) של AppWidgetHost.onProvidersChanged. בתגובה, מארח הווידג'ט טוען מחדש את כל פרטי הספק שלו.
  3. כשמציגים תצוגה מקדימה של ווידג'ט, המארח בודק את AppWidgetProviderInfo.generatedPreviewCategories. אם הקטגוריה שנבחרה זמינה, הוא קורא ל-AppWidgetManager.getWidgetPreview כדי להציג את התצוגה המקדימה השמורה של הספק הזה.

מתי כדאי להתקשר אל setWidgetPreview

מכיוון שאין קריאה חוזרת (callback) כדי לספק תצוגות מקדימות, האפליקציות יכולות לבחור לשלוח תצוגות מקדימות בכל שלב שבו הן פועלות. תדירות העדכון של התצוגה המקדימה תלויה בתרחיש לדוגמה שבו משתמשים בווידג'ט.

ברשימה הבאה מתוארות שתי הקטגוריות העיקריות של תרחישים לדוגמה לשימוש בתצוגה המקדימה:

  • ספקים שמציגים נתונים אמיתיים בתצוגות המקדימות של הווידג'טים שלהם, כמו מידע מותאם אישית או מידע עדכני. הספקים האלה יכולים להגדיר את התצוגה המקדימה אחרי שהמשתמש נכנס לחשבון או ביצע הגדרה ראשונית באפליקציה. לאחר מכן, הם יכולים להגדיר משימה תקופתית לעדכון התצוגות המקדימה בקצב שהם בוחרים. דוגמאות לווידג'טים מהסוג הזה הן ווידג'ט של תמונות, ווידג'ט של יומן, ווידג'ט של מזג אוויר או ווידג'ט של חדשות.
  • ספקים שמציגים מידע סטטי בתצוגות מקדימות או בווידג'טים של פעולות מהירות שלא מציגים נתונים. הספקים האלה יכולים להגדיר קטעי מקדים פעם אחת, כשהאפליקציה מופעלת בפעם הראשונה. דוגמאות לווידג'טים מהסוג הזה כוללות ווידג'ט של פעולות מהירות ב-Drive או ווידג'ט של קיצורי דרך ב-Chrome.

יכול להיות שחלק מהספקים יציג תצוגות מקדימות סטטיות בבורר של מצב Hub, אבל מידע אמיתי בבורר של מסך הבית. הספקים האלה צריכים לפעול בהתאם להנחיות בשני התרחישים לדוגמה האלה כדי להגדיר קטעי מקדים.

תמונה בתוך תמונה

ב-Android 15 יש שינויים בתכונה 'תמונה בתוך תמונה' (PiP) שמבטיחים מעבר חלק יותר כשנכנסים למצב PiP. התכונה הזו שימושית לאפליקציות שיש בהן רכיבי ממשק משתמש שמופיעים בשכבת-על מעל ממשק המשתמש הראשי, ועוברים למצב PiP.

מפתחים משתמשים בקריאה החוזרת (callback) onPictureInPictureModeChanged כדי להגדיר לוגיקה שמחליפה את החשיפה של רכיבי ממשק המשתמש שמופיעים בשכבה העליונה. הקריאה החוזרת הזו מופעלת כשהאנימציה של הכניסה או היציאה מ-PiP מסתיימת. החל מגרסה Android 15, הכיתה PictureInPictureUiState כוללת מצב נוסף.

במצב הזה של ממשק המשתמש, אפליקציות שמטרגטות ל-Android 15 (רמת API ‏35) יבחינו בקריאה החוזרת (callback) של Activity#onPictureInPictureUiStateChanged עם isTransitioningToPip() ברגע שהאנימציה של התמונה בתוך התמונה תתחיל. יש הרבה רכיבי ממשק משתמש שלא רלוונטיים לאפליקציה כשהיא במצב PiP, למשל תצוגות או פריסות שכוללות מידע כמו הצעות, סרטונים קרובים, דירוגים וכותרות. כשהאפליקציה עוברת למצב PiP, משתמשים ב-callback‏ onPictureInPictureUiStateChanged כדי להסתיר את רכיבי ממשק המשתמש האלה. כשהאפליקציה עוברת למצב מסך מלא מחלון ה-PiP, צריך להשתמש בקריאה החוזרת (callback) onPictureInPictureModeChanged כדי לבטל את ההסתרה של הרכיבים האלה, כפי שמתואר בדוגמאות הבאות:

override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements
        }
    }
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements
        }
    }

החלפת המצב המהירה של רכיבי ממשק המשתמש הלא רלוונטיים (בחלון PiP) עוזרת להבטיח אנימציה חלקה יותר של מעבר ל-PiP ללא הבהוב.

כללים משופרים של 'נא לא להפריע'

AutomaticZenRule מאפשר לאפליקציות להתאים אישית את תשומת הלב כללי ניהול (נא לא להפריע) ומחליטים מתי להפעיל או להשבית אותם. ב-Android 15 יש שיפור משמעותי בכללים האלה, במטרה לשפר את חוויית המשתמש. השיפורים הבאים כלולים:

  • הוספת סוגים ל-AutomaticZenRule מאפשרת למערכת להחיל סוגים מיוחדים לטיפול בכללים מסוימים.
  • הוספת סמל אל AutomaticZenRule עוזרת לשפר את המצבים מה אפשר לזהות.
  • הוספת מחרוזת triggerDescription ל-AutomaticZenRule שמתארת התנאים שבהם הכלל צריך להיות פעיל עבור המשתמש.
  • תאריך ההוספה ZenDeviceEffects עד AutomaticZenRule, כך שהכללים יכולים להפעיל פעולות כמו גווני אפור תצוגה, מצב לילה או עמעום הטפט.

הגדרת VibrationEffect לערוצי התראות

ב-Android 15 יש תמיכה בהגדרת רטט עשירים להתראות נכנסות באמצעות הערוץ באמצעות NotificationChannel.setVibrationEffect, כך המשתמשים יכולים להבחין בין סוגים שונים של התראות, שצריך לבדוק את המכשיר שלהם.

צ'יפ בשורת הסטטוס של הקרנת המדיה ועצירה אוטומטית

Media projection can expose private user information. A new, prominent status bar chip makes users aware of any ongoing screen projection. Users can tap the chip to stop screen casting, sharing, or recording. Also, for a more intuitive user experience, any in‑progress screen projection now automatically stops when the device screen is locked.

Status bar chip for screen sharing, casting, and recording.

מסכים גדולים וגורמי צורה

ב-Android 15 יש תמיכה באפליקציות שמאפשרת להפיק את המקסימום מהעיצובים השונים של Android, כולל מסכים גדולים, מכשירים מתקפלים ומכשירים עם מסך מתהפך.

ריבוי משימות משופר במסך גדול

ב-Android 15 יש למשתמשים דרכים טובות יותר לבצע משימות מרובות במכשירים עם מסכים גדולים. עבור לדוגמה, משתמשים יכולים לשמור את השילובים המועדפים שלהם של אפליקציות במסך מפוצל לגשת לשורת המשימות במסך ולהצמיד אותה כדי לעבור במהירות בין אפליקציות. כלומר ולכן חשוב יותר מתמיד לוודא שהאפליקציה שלכם יכולה להיות מותאמת.

ב-Google I/O יש מפגשים בנושא יצירת Android דינמי אפליקציות ובניית ממשק משתמש באמצעות Material 3 ספרייה מותאמת שיכול לעזור, והתיעוד שלנו כולל מידע נוסף שיעזור לכם לעצב מודלים גדולים מסכים.

תמיכה במסך הקדמי

Your app can declare a property that Android 15 uses to allow your Application or Activity to be presented on the small cover screens of supported flippable devices. These screens are too small to be considered as compatible targets for Android apps to run on, but your app can opt in to supporting them, making your app available in more places.

קישוריות

ב-Android 15 מתבצע עדכון לפלטפורמה כדי לתת לאפליקציה שלכם גישה להתקדמות האחרונה בתחומי התקשורת והטכנולוגיות האלחוטיות.

תמיכה בלוויין

ב-Android 15 אנחנו ממשיכים להרחיב את תמיכת הפלטפורמה בקישוריות לווינית, ומוסיפים כמה רכיבי ממשק משתמש כדי להבטיח חוויית משתמש עקבית בכל סביבות הקישוריות הלווינית.

אפליקציות יכולות להשתמש ב-ServiceState.isUsingNonTerrestrialNetwork() כדי לזהות מכשירים שמחוברים ללוויין, וכך להגביר את המוּדעוּת מדוע שירותי רשת מלאים אינם זמינים. בנוסף, ב-Android 15 יש תמיכה באפליקציות SMS ו-MMS, וגם באפליקציות RCS שהוגדרו מראש, כדי להשתמש בחיבור לווין לשליחה ולקבלה של הודעות.

התראה מופיעה כשהמכשיר מתחבר ללוויין.

חוויית שימוש חלקה יותר ב-NFC

Android 15 is working to make the tap to pay experience more seamless and reliable while continuing to support Android's robust NFC app ecosystem. On supported devices, apps can request the NfcAdapter to enter observe mode, where the device listens but doesn't respond to NFC readers, sending the app's NFC service PollingFrame objects to process. The PollingFrame objects can be used to auth ahead of the first communication to the NFC reader, allowing for a one tap transaction in many cases.

In addition, apps can register a filter on supported devices so they can be notified of polling loop activity, which allows for smooth operation with multiple NFC-aware applications.

תפקיד ב-Wallet

Android 15 introduces a Wallet role that allows tighter integration with the user's preferred wallet app. This role replaces the NFC default contactless payment setting. Users can manage the Wallet role holder by navigating to Settings > Apps > Default Apps.

The Wallet role is used when routing NFC taps for AIDs registered in the payment category. Taps always go to the Wallet role holder unless another app that is registered for the same AID is running in the foreground.

This role is also used to determine where the Wallet Quick Access tile should go when activated. When the role is set to "None", the Quick Access tile isn't available and payment category NFC taps are only delivered to the foreground app.

אבטחה

Android 15 עוזר לכם לשפר את האבטחה של האפליקציה, להגן על הנתונים של האפליקציה ולספק למשתמשים יותר שקיפות ושליטה בנתונים שלהם. כדאי לצפות בהרצאה הגנה על אבטחת המשתמשים ב-Android מ-Google I/O כדי לקבל מידע נוסף על הפעולות שאנחנו מבצעים כדי לשפר את אמצעי ההגנה על המשתמשים ולהגן על האפליקציה מפני איומים חדשים.

שילוב של Credential Manager עם מילוי אוטומטי

Starting with Android 15, developers can link specific views like username or password fields with Credential Manager requests, making it easier to provide a tailored user experience during the sign-in process. When the user focuses on one of these views, a corresponding request is sent to Credential Manager. The resulting credentials are aggregated across providers and displayed in autofill fallback UIs, such as inline suggestions or drop-down suggestions. The Jetpack androidx.credentials library is the preferred endpoint for developers to use and will soon be available to further enhance this feature in Android 15 and higher.

שילוב של הרשמה וכניסה בהקשה אחת עם הנחיות לביומטריה

מנהל פרטי הכניסה משלב הנחיות ביומטריות בתהליכי היצירה והכניסה של פרטי הכניסה, כך שהספקים לא צריכים לנהל את ההנחיות הביומטריות. כתוצאה מכך, ספקי פרטי הכניסה צריכים להתמקד רק בתוצאות של תהליכי היצירה והאחזור, עם תוספת של תוצאת התהליך הביומטרי. התהליך הפשוט הזה יוצר פרטי כניסה יעילים וקלים יותר תהליך היצירה והאחזור.

ניהול מפתחות להצפנה מקצה לקצה

We are introducing the E2eeContactKeysManager in Android 15, which facilitates end-to-end encryption (E2EE) in your Android apps by providing an OS-level API for the storage of cryptographic public keys.

The E2eeContactKeysManager is designed to integrate with the platform contacts app to give users a centralized way to manage and verify their contacts' public keys.

בדיקות הרשאות במזהי URI של תוכן

Android 15 introduces a set of APIs that perform permission checks on content URIs:

נגישות

ב-Android 15 נוספו תכונות לשיפור הנגישות למשתמשים.

ברייל משופר

In Android 15, we've made it possible for TalkBack to support Braille displays that are using the HID standard over both USB and secure Bluetooth.

This standard, much like the one used by mice and keyboards, will help Android support a wider range of Braille displays over time.

אינטרנציונליזציה

ב-Android 15 נוספו תכונות ויכולות שמשתלבות בחוויית המשתמש כשמשתמשים במכשיר בשפות שונות.

גופן משתנה CJK

Starting with Android 15, the font file for Chinese, Japanese, and Korean (CJK) languages, NotoSansCJK, is now a variable font. Variable fonts open up possibilities for creative typography in CJK languages. Designers can explore a broader range of styles and create visually striking layouts that were previously difficult or impossible to achieve.

How the variable font for Chinese, Japanese, and Korean (CJK) languages appears with different font widths.

תצוגה צפופה בין התווים

החל מ-Android 15, אפשר להצדיק את הטקסט עם ריווח של אותיות באמצעות JUSTIFICATION_MODE_INTER_CHARACTER. ההצדקה בין המילים הייתה הושקה לראשונה ב-Android 8.0 (רמת API 26), להצדקה מספק יכולות דומות לשפות שמשתמשות לצורך פילוח, כמו סינית, יפנית ועוד.

פריסה לטקסט ביפנית באמצעות JUSTIFICATION_MODE_NONE.
פריסה לטקסט באנגלית באמצעות JUSTIFICATION_MODE_NONE.


פריסה של טקסט ביפנית באמצעות JUSTIFICATION_MODE_INTER_WORD.
פריסה לטקסט באנגלית באמצעות JUSTIFICATION_MODE_INTER_WORD.


פריסה של טקסט ביפנית באמצעות JUSTIFICATION_MODE_INTER_CHARACTER.
פריסה לטקסט באנגלית באמצעות JUSTIFICATION_MODE_INTER_CHARACTER.

הגדרה אוטומטית של מעבר שורה

Android התחילה לתמוך במעברי שורה שמבוססים על ביטויים ביפנית ובקוריאנית Android 13 (רמת API 33). עם זאת, אמנם הפסקות שורות שמבוססות על ביטויים משפרות את הקריאוּת של שורות קצרות של טקסט, אבל הן לא מתאימות לשורות ארוכות של טקסט. ב-Android 15, אפליקציות יכולות להשתמש בהפסקות שורות שמבוססות על ביטויים רק בשורות קצרות של טקסט, באמצעות האפשרות LINE_BREAK_WORD_STYLE_AUTO. האפשרות הזו בוחרת את סגנון המילים המתאים ביותר לטקסט.

בשורות טקסט קצרות, המערכת משתמשת במעברי שורה שמבוססים על ביטויים, ופועלים באופן זהה בתור LINE_BREAK_WORD_STYLE_PHRASE, כמו שמוצג התמונה הבאה:

לטקסטים קצרים, LINE_BREAK_WORD_STYLE_AUTO מחיל חלוקות שורות שמבוססות על ביטויים כדי לשפר את הקריאוּת של הטקסט. הפעולה הזו זהה להחלת LINE_BREAK_WORD_STYLE_PHRASE.

בשורות טקסט ארוכות יותר, LINE_BREAK_WORD_STYLE_AUTO משתמש בפונקציית "לא" סגנון מילים של מעבר שורה, שפועל באותו אופן כמו LINE_BREAK_WORD_STYLE_NONE, כפי שמוצג התמונה הבאה:

לשורות טקסט ארוכות, LINE_BREAK_WORD_STYLE_AUTO לא מחילה סגנון מילים של מעבר שורה כדי לשפר את נוחות הקריאה של הטקסט. הפעולה הזו זהה להחלת LINE_BREAK_WORD_STYLE_NONE.

גופן נוסף של היפנית הנטאיגאנה

בגרסה Android 15, קובץ גופן של היראגאנה היפנית הישנה (המכונה Hentaigana) נכלל בחבילה כברירת מחדל. הצורות הייחודיות של דמויות הנטאייגה יכולות להוסיף מראה ייחודי לגרפיקה או לעיצוב, תוך שמירה על רמת דיוק גבוהה הפצה והבנה של מסמכים יפניים עתיקים.

סגנון התווים והטקסט של ההנטיגנה היפני font.

VideoLAN cone Copyright (c) 1996-2010 VideoLAN. This logo or a modified version may be used or modified by anyone to refer to the VideoLAN project or any product developed by the VideoLAN team, but does not indicate endorsement by the project.

Vulkan and the Vulkan logo are registered trademarks of the Khronos Group Inc.

OpenGL is a registered trademark and the OpenGL ES logo is a trademark of Hewlett Packard Enterprise used by permission by Khronos.