ב-Android 11 יש תכונות חדשות וממשקי API חדשים למפתחים. בקטעים הבאים מוסבר על התכונות של האפליקציות ועל תחילת העבודה עם ממשקי ה-API הרלוונטיים.
בדוח ההבדלים בין הגרסאות של ממשקי ה-API תוכלו למצוא רשימה מפורטת של ממשקי API חדשים, משופרים והוסרו. פרטים על ממשקי API חדשים זמינים בהפניית Android API – ממשקי API חדשים מודגשים. בנוסף, כדי לקבל מידע על תחומים שבהם שינויים בפלטפורמה עשויים להשפיע על האפליקציות שלכם, כדאי לעיין בשינויים בהתנהגות של Android 11 באפליקציות שמטרגטות את Android R ובכל האפליקציות, וגם בשינויים בנושא פרטיות.
חוויות חדשות
פקדי מכשירים
Android 11 כולל ממשק API חדש של ControlsProviderService
שבעזרתו אפשר לחשוף אמצעי בקרה למכשירים חיצוניים מחוברים. אמצעי הבקרה האלה מופיעים בקטע אמצעי בקרה למכשיר בתפריט ההפעלה של Android. למידע נוסף, ראו שליטה במכשירים חיצוניים.
פקדי מדיה
ב-Android 11 השתנה האופן שבו מוצגים פקדי המדיה. פקדי המדיה מופיעים ליד ההגדרות המהירות. הסשנים מכמה אפליקציות מסודרים בקרוסלה שאפשר להחליק, שכוללת שידורים שמתנגנים באופן מקומי בטלפון, שידורים מרחוק, כמו אלה שזוהו במכשירים חיצוניים או סשנים של העברה (cast), וסשנים קודמים שאפשר להמשיך מהם לפי הסדר שבו הם הופעלו בפעם האחרונה.
משתמשים יכולים להפעיל מחדש סשנים קודמים מהקרוסלה בלי להפעיל את האפליקציה. כשהפעלת הסרטון מתחילה, המשתמש יכול להשתמש באמצעי הבקרה של המדיה בדרך הרגילה.
מידע נוסף זמין במאמר אמצעי בקרה על מדיה.
מסכים
תמיכה משופרת בתצוגות של רשימת מודעות Waterfall
ב-Android 11 יש כמה ממשקי API לתמיכה במסכים מסוג waterfall, מסכים שמקיפים את קצה המכשיר. המסכים האלה נחשבים כגרסה של מסכים עם חתכים במסך. השיטות הקיימות של DisplayCutout
.getSafeInset…()
מחזירות עכשיו את ה-safe inset כדי למנוע אזורים של 'מפל מודעות' וגם חתיכות חתוכות.
כדי להציג את תוכן האפליקציה באזור המפל, מבצעים את הפעולות הבאות:
כדי לקבל את המימדים המדויקים של התמונה הממוזערת ב-Waterfall, צריך להתקשר למספר
DisplayCutout.getWaterfallInsets()
.מגדירים את מאפיין הפריסה של החלון
layoutInDisplayCutoutMode
לערךLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
כדי לאפשר לחלון להשתרע על אזורי המגרעת והמפל בכל קצוות המסך. חשוב לוודא שאין תוכן חיוני באזורי החיתוך או באזורי המפל.
חיישן זווית ציר ומכשירים מתקפלים
ב-Android 11, אפליקציות שפועלות במכשירים עם הגדרות מסך שמבוססות על ציר מאפשרות לקבוע את זווית הציר באמצעות חיישן חדש עם TYPE_HINGE_ANGLE
וחיישן חדש SensorEvent
שיכול לעקוב אחרי זווית הציר ולספק מדידה בזוויות בין שני חלקים חיוניים במכשיר. אפשר להשתמש במדידות הגולמיות האלה כדי לבצע אנימציות מפורטות בזמן שהמשתמש מניע את המכשיר.
שיחות
שיפורים בשיחות
ב-Android 11 יש כמה שיפורים בטיפול בשיחות. שיחות הן תקשורת דו-כיוונית בזמן אמת בין שני אנשים או יותר. השיחות האלה מוצגות במקום בולט, ולמשתמשים יש כמה אפשרויות חדשות לאינטראקציה איתן.
מידע נוסף על שיחות ועל האופן שבו האפליקציה יכולה לתמוך בהן זמין במאמר אנשים ושיחות.
בועות צ'אט
בועות זמינות עכשיו למפתחים כדי לעזור להם להציג שיחות ברחבי המערכת. בועות הייתה תכונה ניסיונית ב-Android 10 שהופעל באמצעות אפשרות למפתחים. ב-Android 11, כבר אין צורך בכך.
אם אפליקציה מטרגטת ל-Android 11 (רמת API 30) ואילך, ההתראות שלה לא יוצגו כבועות אלא אם הן עומדות בדרישות החדשות לשיחות. באופן ספציפי, ההתראה צריכה להיות משויכת לקיצור דרך.
לפני Android 11, אם רצית שההתראה תוצג בבועה, היה עליך לציין במפורש שההתראה מוגדרת להופיע תמיד במצב ממשק המשתמש של המסמך. החל מ-Android 11, כבר לא צריך להגדיר את ההגדרה הזו באופן מפורש. אם ההתראה מוצגת בבועה, הפלטפורמה מגדירה באופן אוטומטי שההתראה תמיד תוצג במצב ממשק המשתמש של המסמך.
יש כמה שיפורים בביצועים של בועות, והמשתמשים יכולים להפעיל ולהשבית בועות מכל אפליקציה בקלות רבה יותר. למפתחים שהטמיעו תמיכה ניסיונית, יש כמה שינויים בממשקי ה-API ב-Android 11:
- המבנה
BubbleMetadata.Builder()
ללא פרמטרים הוצא משימוש. במקום זאת, צריך להשתמש באחד משני המרכיבים החדשיםBubbleMetadata.Builder(PendingIntent, Icon)
אוBubbleMetadata.Builder(String)
. - כדי ליצור את
BubbleMetadata
מתוך מזהה קיצור דרך, קוראים ל-BubbleMetadata.Builder(String)
. המחרוזת המועברת צריכה להתאים למזהה הקיצור שסופק ל-Notification.Builder
. - יוצרים סמלי בועות באמצעות
Icon.createWithContentUri()
או באמצעות השיטה החדשהcreateWithAdaptiveBitmapContentUri()
.
אינדיקטורים חזותיים של 5G
מידע על הצגת אינדיקטורים של 5G במכשירים של המשתמשים זמין במאמר איך מודיעים למשתמשים שהם מחוברים לרשת 5G.
פרטיות
ב-Android 11 יש מספר רב של שינויים והגבלות שנועדו לשפר את פרטיות המשתמשים. מידע נוסף זמין בדף פרטיות.
אבטחה
עדכונים לגבי אימות ביומטרי
כדי לעזור לכם לשלוט ברמת האבטחה של נתוני האפליקציה, ב-Android 11 יש כמה שיפורים באימות הביומטרי. השינויים האלה מופיעים גם בספריית Jetpack Biometric.
סוגי אימות
ב-Android 11 נוסף הממשק BiometricManager.Authenticators
, שבעזרתו אפשר להצהיר על סוגי האימות שהאפליקציה תומכת בהם.
איך בודקים איזה סוג אימות נעשה
אחרי שהמשתמש יאומת, תוכלו לבדוק אם הוא אומת באמצעות פרטי כניסה של המכשיר או באמצעות פרטי כניסה ביומטריים, על ידי קריאה ל-getAuthenticationType()
.
תמיכה נוספת במפתחות לאימות לפי שימוש
ב-Android 11 יש תמיכה רחבה יותר באימות באמצעות מפתחות לאימות לשימוש חד-פעמי.
שיטות שהוצאו משימוש
ב-Android 11, השיטות הבאות הוצאו משימוש:
- השיטה
setDeviceCredentialAllowed()
. - השיטה
setUserAuthenticationValidityDurationSeconds()
. - הגרסה בעלת עומס יתר של
canAuthenticate()
שלא מקבלת ארגומנטים.
שיתוף מאובטח של מערכי נתונים גדולים
במצבים מסוימים, כמו מצבים שכוללים למידת מכונה או הפעלת מדיה, יכול להיות שתרצו להשתמש באותה קבוצת נתונים גדולה כמו באפליקציה אחרת. בגרסאות קודמות של Android, האפליקציה שלכם והאפליקציה השנייה היו צריכות להוריד עותק נפרד של אותה קבוצת נתונים.
כדי לצמצם את עודפות הנתונים, גם ברשת וגם בדיסק, ב-Android 11 אפשר לשמור במטמון במכשיר את מערכי הנתונים הגדולים האלה באמצעות blobs של נתונים משותפים. מידע נוסף על שיתוף מערכי נתונים זמין במדריך המפורט בנושא שיתוף מערכי נתונים גדולים.
ביצוע הצפנה מבוססת-קבצים אחרי הפעלה מחדש ב-OTA ללא פרטי כניסה של משתמשים
אחרי שהמכשיר משלים עדכון OTA ומופעל מחדש, המפתחות המוצפנים של פרטי הכניסה (CE) שמאוחסנים באחסון שמוגן באמצעות פרטי הכניסה זמינים באופן מיידי לפעולות של הצפנה מבוססת-קובץ (FBE). המשמעות היא שאחרי עדכון OTA, האפליקציה יכולה להמשיך לפעול במשימות שדורשות את מפתחות ה-CE לפני שהמשתמש מזין את קוד האימות, קו ביטול הנעילה או הסיסמה שלו.
ביצועים ואיכות
ניפוי באגים אלחוטי
ב-Android 11 יש תמיכה בפריסה ובניפוי באגים של האפליקציה באופן אלחוטי מתחנת העבודה באמצעות Android Debug Bridge (adb). לדוגמה, תוכלו לפרוס את האפליקציה לניפוי באגים במספר מכשירים מרוחקים בלי לחבר את המכשיר פיזית באמצעות USB ולהתמודד עם בעיות נפוצות בחיבור USB, כמו התקנת מנהל התקן. מידע נוסף זמין במאמר הפעלת אפליקציות במכשיר חומרה.
התקנה מצטברת של APK באמצעות ADB
התקנת חבילות APK גדולות (2GB+) במכשיר עשויה להימשך זמן רב, גם אם בוצע שינוי קטן באפליקציה. התקנה מצטברת של חבילות APK באמצעות ADB (Android Debug Bridge) מאיצה את התהליך הזה על ידי התקנה של מספיק מקבץ ה-APK כדי להפעיל את האפליקציה, בזמן שהנתונים הנותרים מועברים בסטרימינג ברקע. adb install
ישתמש בתכונה הזו באופן אוטומטי אם המכשיר תומך בה וSDK Platform-Tools העדכני ביותר מותקן. אם היא לא נתמכת, השיטה שמוגדרת כברירת מחדל תוצג ללא התראה.
כדי להשתמש בתכונה, משתמשים בפקודת adb הבאה. אם המכשיר לא תומך בהתקנה מצטברת, הפקודה תיכשל ויודפס הסבר מפורט.
adb install --incremental
לפני שמפעילים התקנה מצטברת של APK ב-ADB, צריך לחתום על קובץ ה-APK וליצור קובץ APK Signature Scheme v4. כדי שהתכונה הזו תפעל, קובץ החתימה v4 צריך להיות ממוקם לצד קובץ ה-APK.
זיהוי שגיאות באמצעות מנהל הקצאת הזיכרון המקורי
GWP-ASan היא תכונה של מנהל זיכרון נייטיב שעוזרת למצוא באגים מסוג use-after-free ו-heap-buffer-overflow. אפשר להפעיל את התכונה הזו באופן גלובלי או בתהליכים משניים ספציפיים באפליקציה. מידע נוסף זמין במדריך GWP-Asan.
Neural Networks API 1.3
ב-Android 11 יש הרחבה ושיפור של Neural Networks API (NNAPI).
פעולות חדשות
ב-NNAPI 1.3 נוסף סוג חדש של אופרנד, TENSOR_QUANT8_ASYMM_SIGNED
, כדי לתמוך בסכימה החדשה של TensorFlow Lite לקונטיינציה.
בנוסף, ב-NNAPI 1.3 נוספו הפעולות החדשות הבאות:
QUANTIZED_LSTM
IF
WHILE
ELU
HARD_SWISH
FILL
RANK
אמצעי בקרה חדשים ללמידת מכונה
ב-NNAPI 1.3 יש אמצעי בקרה חדשים שעוזרים ללמידת המכונה לפעול בצורה חלקה:
QoS API: ממשק ה-API החדש של איכות השירות כולל תמיכה בעדיפות ובמועדים אחרונים לביצוע משימות ב-NNAPI באמצעות הפונקציות החדשות הבאות:
קלט/פלט של תחום זיכרון: NNAPI 1.3 כולל תמיכה בתחומי זיכרון כקלט ופלט לביצוע. כך אפשר להסיר עותקים מיותרים של אותם נתונים בין רכיבי מערכת שונים, וכך לשפר את הביצועים בסביבת זמן הריצה של רשתות נוירונליות ב-Android. התכונה הזו מוסיפה קבוצה של ממשקי API חדשים ל-NDK לשימוש עם אובייקטים מסוג
ANeuralNetworksMemoryDesc
ו-ANeuralNetworkMemory
, כולל הפונקציות הבאות:ANeuralNetworksMemoryDesc_create()
ANeuralNetworksMemoryDesc_free()
ANeuralNetworksMemoryDesc_addInputRole()
ANeuralNetworksMemoryDesc_addOutputRole()
ANeuralNetworksMemoryDesc_setDimensions()
ANeuralNetworksMemoryDesc_finish()
ANeuralNetworksMemory_createFromDesc()
ANeuralNetworksMemory_copy()
מידע נוסף זמין בדוגמה לדומיין של זיכרון רשת עצבית.
תמיכה ב-Dependency API וב-sync fence: NNAPI 1.3 כולל תמיכה במחשוב אסינכרוני עם יחסי תלות, שמאפשרת לצמצם משמעותית את התקורה בזמן ההפעלה של מודלים קטנים בשרשור. התכונה הזו מוסיפה את הפונקציות החדשות הבאות:
זרימת בקרה: NNAPI 1.3 כולל תמיכה בזרימת בקרה כללית באמצעות פעולות הגרף החדשות
ANEURALNETWORKS_IF
ו-ANEURALNETWORKS_WHILE
, שמקבלות מודלים אחרים כארגומנטים באמצעות סוג המשתנה החדשANEURALNETWORKS_MODEL
. בנוסף, התכונה הזו מוסיפה את הפונקציות החדשות הבאות:
NDK Thermal API
כשמכשירים מתחממים מדי, הם עשויים להגביל את המעבד (CPU) ו/או את המעבד הגרפי (GPU), וזה עלול להשפיע על האפליקציות בדרכים לא צפויות. יש סיכוי גבוה יותר לבעיות באפליקציות או במשחקים שכוללים גרפיקה מורכבת, חישובים כבדים או פעילות רשת מתמשכת.
אתם יכולים להשתמש ב-NDK Thermal API ב-Android 11 כדי לעקוב אחרי שינויי הטמפרטורה במכשיר, ואז לבצע פעולות כדי לשמור על צריכת חשמל נמוכה יותר וטמפרטורה נמוכה יותר במכשיר. ממשק ה-API הזה דומה ל-Java Thermal API. אפשר להשתמש בו כדי לקבל התראות על כל שינוי בסטטוס התרמי או כדי לבדוק את הסטטוס הנוכחי ישירות.
טקסט וקלט
מעברים משופרים של IME
ב-Android 11 נוספו ממשקי API חדשים לשיפור המעברים של עורכי שיטות קלט (IME), כמו מקלדות במסך. ממשקי ה-API האלה מאפשרים לשנות בקלות את תוכן האפליקציה בהתאם להופעה וההיעלמוּת של ה-IME, וגם בהתאם לאלמנטים אחרים כמו שורת הסטטוס וסרגלי הניווט.
כדי להציג IME כשהמיקוד נמצא ב-EditText
כלשהו, צריך להפעיל את הפונקציה view.getInsetsController().show(Type.ime())
.
(אפשר להפעיל את השיטה הזו בכל תצוגה באותה היררכיה שבה נמצא ה-EditText
הממוקד, אין צורך להפעיל אותה ב-EditText
באופן ספציפי). כדי להסתיר את ה-IME, קוראים את הפונקציה view.getInsetsController().hide(Type.ime())
.
כדי לבדוק אם IME גלוי כרגע, אפשר להריץ את הפונקציה view.getRootWindowInsets().isVisible(Type.ime())
.
כדי לסנכרן את התצוגות של האפליקציה עם ההופעה וההיעלמוּת של ה-IME, מגדירים מאזין בתצוגה על ידי העברת WindowInsetsAnimation.Callback
ל-View.setWindowInsetsAnimationCallback()
.
(אפשר להגדיר את המאזין הזה בכל תצוגה, הוא לא חייב להיות EditText
). ה-IME קורא לשיטה onPrepare()
של המאזין, ואז קורא ל-onStart()
בתחילת המעבר. לאחר מכן, הוא קורא ל-onProgress()
בכל שלב בתהליך המעבר. בסיום המעבר, ה-IME קורא ל-onEnd()
.
בכל שלב במעבר, אפשר לבדוק את מידת ההתקדמות שלו באמצעות קריאה ל-WindowInsetsAnimation.getFraction()
.
דוגמה לשימוש ב-API האלה מופיעה בדוגמת הקוד החדשה WindowInsetsAnimation.
שליטה באנימציה של IME
אפשר גם לשלוט באנימציה של ה-IME או באנימציה של סרגל מערכת אחר, כמו סרגל הניווט. כדי לעשות זאת, קודם צריך להפעיל את setOnApplyWindowInsetsListener()
כדי להגדיר מאזין חדש לשינויים בהוספה של חלון:
Kotlin
rootView.setOnApplyWindowInsetsListener { rootView, windowInsets -> val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime()) rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom) // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. WindowInsets.CONSUMED }
Java
mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { @Override public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime()); mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom); // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. return WindowInsets.CONSUMED; } });
כדי להזיז את סרגל ה-IME או סרגל מערכת אחר, צריך להפעיל את השיטה controlWindowInsetsAnimation()
של הבקר:
Kotlin
view.windowInsetsController.controlWindowInsetsAnimation( Type.ime(), 1000, LinearInterpolator(), cancellationSignal, object : WindowInsetsAnimationControlListener() { fun onReady(controller: WindowInsetsAnimationController, types: Int) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */) } } );
Java
mRoot.getWindowInsetsController().controlWindowInsetsAnimation( Type.ime(), 1000, new LinearInterpolator(), cancellationSignal, new WindowInsetsAnimationControlListener() { @Override public void onReady( @NonNull WindowInsetsAnimationController controller, int types ) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */); } @Override public void onCancelled() {} });
עדכונים בספריות ICU
ב-Android 11 חבילת android.icu
מתעדכנת כך שתשתמש בגרסה 66 של ספריית ICU, לעומת גרסה 63 ב-Android 10. גרסת הספרייה החדשה כוללת נתוני לוקל של CLDR מעודכנים ומספר שיפורים בתמיכה באינטרנציונליזציה ב-Android.
השינויים הבולטים בגרסאות החדשות של הספריות כוללים:
- הרבה ממשקי API לפורמטים תומכים עכשיו בסוג חדש של אובייקט מוחזר שמרחיב את
FormattedValue
. - ה-API של
LocaleMatcher
משופר עם סוג של בונה, תמיכה בסוגjava.util.Locale
וסוג של תוצאה עם נתונים נוספים על התאמה. - עכשיו יש תמיכה ב-Unicode 13.
מדיה
הקצאת מאגרי נתונים זמניים של MediaCodec
Android 11 כולל ממשקי API חדשים של MediaCodec
שמעניקים לאפליקציות שליטה רבה יותר בזמן הקצאת מאגרי קלט ופלט. כך האפליקציה יכולה לנהל את הזיכרון בצורה יעילה יותר.
כיתות חדשות:
שיטות חדשות:
MediaCodec.getQueueRequest()
MediaCodec.getOutputFrame()
MediaCodec.LinearBlock.isCodecCopyFreeCompatible()
בנוסף, השתנו התנהגויות של שתי שיטות ב-MediaCodec.Callback()
:
onInputBufferAvailable()
- במקום להפעיל את
MediaCodec.getInputBuffer()
ו-MediaCodec.queueInputBuffer()
עם האינדקס, אם האפליקציות מוגדרות לשימוש ב-Block Model API, הן צריכות להשתמש ב-MediaCodec.getQueueRequest
עם האינדקס, ולצרף לחרוזת את LinearBlock/HardwareBuffer. onOutputBufferAvailable()
- במקום להפעיל את
MediaCodec.getOutputBuffer()
עם האינדקס, אפליקציות יכולות להשתמש ב-MediaCodec.getOutputFrame()
עם האינדקס כדי לקבל את האובייקטOutputFrame
עם מידע נוסף ומאגרים של LinearBlock/HardwareBuffer.
פענוח בזמן אחזור קצר ב-MediaCodec
ב-Android 11 יש שיפורים ב-MediaCodec
שמאפשרים תמיכה בפענוח עם זמן אחזור נמוך במשחקים ובאפליקציות אחרות שפועלות בזמן אמת. כדי לבדוק אם קודק תומך בפענוח עם זמן אחזור קצר, מעבירים את הערך FEATURE_LowLatency
אל MediaCodecInfo.CodecCapabilities.isFeatureSupported()
.
כדי להפעיל או להשבית את פענוח זמן האחזור הנמוך, מבצעים אחת מהפעולות הבאות:
- מגדירים את המפתח החדש
KEY_LOW_LATENCY
לערך 0 או 1 באמצעותMediaCodec.configure()
. - מגדירים את מפתח הפרמטר החדש
PARAMETER_KEY_LOW_LATENCY
לערך 0 או 1 באמצעותMediaCodec.setParameters()
.
פונקציית AAudio חדשה AAudioStream_release()
הפונקציה AAudioStream_close()
משחררת וסוגרת בו-זמנית שידור אודיו. זה עלול להיות מסוכן. אם תהליך אחר ינסה לגשת לשידור אחרי שהוא נסגר, התהליך ייפול.
הפונקציה החדשה AAudioStream_release()
משחררת את המקור אבל לא סוגרת אותו. כך המשאבים שלו יהיו פנויים והסטטוס של הסטרימינג יהיה ידוע. האובייקט נשאר עד שמפעילים את AAudioStream_close()
.
MediaParser API
MediaParser הוא ממשק API חדש ברמה נמוכה לחילוץ מדיה. הוא גמיש יותר מ-MediaExtractor ומספק שליטה נוספת על הפונקציונליות של חילוץ המדיה.
הקלטת אודיו ממכשיר USB
כשאפליקציה ללא ההרשאה RECORD_AUDIO
משתמשת ב-UsbManager
כדי לבקש גישה ישירה למכשיר אודיו מסוג USB עם יכולת הקלטת אודיו (למשל אוזניות USB), מוצגת הודעת אזהרה חדשה שמבקשת מהמשתמש לאשר את ההרשאה לשימוש במכשיר. המערכת מתעלמת מכל אפשרות של 'שימוש תמיד', ולכן המשתמש צריך לאשר את האזהרה ולהעניק הרשאה בכל פעם שאפליקציה מבקשת גישה.
כדי למנוע את ההתנהגות הזו, האפליקציה צריכה לבקש את ההרשאה RECORD_AUDIO
.
גישה בו-זמנית למיקרופון
ב-Android 11 נוספו שיטות חדשות לממשקי ה-API AudioRecord
, MediaRecorder
ו-AAudioStream
. השיטות האלה מאפשרות להשבית או להפעיל את היכולת לצלם בו-זמנית, ללא קשר לתרחיש לדוגמה שנבחר. שיתוף קלט אודיו
מתג מעבר למכשיר אחר
ב-Android 11 מופעלת התנהגות חדשה באפליקציות שמשתמשות ב-API של Cast וב-MediaRouter.
בנוסף לגישה לאפשרויות ההעברה (cast) מתוך האפליקציה, אפשרויות המעבר מופיעות גם בנגן המדיה של המערכת. כך המשתמשים יכולים לעבור בקלות בין מכשירים כשהם משנים את ההקשר של הצפייה וההאזנה, למשל כשהם צופים בסרטון במטבח לעומת בטלפון, או כשהם מקשיבים לאודיו בבית או ברכב. מתג המעבר למכשיר אחר
קישוריות
שיפורים ב-Wi-Fi Passpoint
למידע על יכולות Passpoint שנוספו ב-Android 11, ראו Passpoint.
הרחבנו את Wi-Fi Suggestion API
ב-Android 11 הורחבה היכולת של Wi-Fi Suggestion API כדי לשפר את יכולות ניהול הרשת של האפליקציה, כולל:
- אפליקציות לניהול קישוריות יכולות לנהל את הרשתות שלהן על ידי מתן הרשאה לבקשות ניתוק.
- רשתות Passpoint משולבות ב-Suggestion API וניתן להציע אותן למשתמש.
- ממשקי ה-API של Analytics מאפשרים לכם לקבל מידע על איכות הרשתות שלכם.
עדכונים של CallScreeningService
החל מ-Android 11, השירות CallScreeningService יכול לבקש מידע על סטטוס האימות של STIR/SHAKEN (verstat) לשיחות נכנסות. המידע הזה מופיע בפרטי השיחה של שיחות נכנסות.
אם ל-CallScreeningService
יש את ההרשאה READ_CONTACTS
, האפליקציה תקבל התראה כשיהיו שיחות נכנסות ממספר שנמצא ברשימת אנשי הקשר של המשתמש או שיחות יוצאות למספר כזה.
מידע נוסף זמין במאמר מניעת זיופים של מזהה מבצע השיחה.
עדכונים של Open Mobile API
מידע על תמיכה ב-OMAPI ב-Android 11 ואילך זמין במאמר תמיכה בקורא של Open Mobile API.
רשתות VPN יעילות
אפליקציות שמטרגטות רמת API 30 ומעלה או שפועלות במכשירים שהושקו עם רמת API 29 ומעלה יכולות להחיל את IKEv2/IPsec על VPN, גם ל-VPN שהוגדרו על ידי משתמשים וגם ל-VPN מבוססי-אפליקציות.
רשתות ה-VPN פועלות באופן מקורי במערכת ההפעלה, וכך מפשטות את הקוד הנדרש כדי ליצור חיבורי VPN מסוג IKEv2/IPsec באפליקציה.
בקרת גישה לרשת לכל תהליך
מידע על הפעלת גישה לרשת לפי תהליך זמין במאמר ניהול השימוש ברשת.
מתן הרשאה להתקנה של כמה הגדרות Passpoint עם אותו FQDN
החל מ-Android 11, אפשר להשתמש ב-PasspointConfiguration.getUniqueId()
כדי לקבל מזהה ייחודי לאובייקט PasspointConfiguration
. כך המשתמשים באפליקציה יוכלו להתקין כמה פרופילים עם אותו שם דומיין מוגדר במלואו (FQDN).
הפונקציונליות הזו מועילה כשספק פורס יותר משילוב אחד של קוד מדינה לנייד (MCC) וקוד רשת לנייד (MNC) ברשת שלו, אבל יש לו רק FQDN אחד. ב-Android 11 ואילך, אפשר להתקין יותר מפרופיל אחד עם אותו FQDN שיתאימה לרשת כספק הבית כשהמשתמש מתקין כרטיס SIM עם MCC או MNC.
תמיכה באנטנה של GNSS
ב-Android 11 מופיעה הכיתה GnssAntennaInfo
, שמאפשרת לאפליקציה להשתמש יותר במיקום מדויק ברמת הסנטימטר שמערכת הניווט הגלובלית (GNSS) יכולה לספק.
מידע נוסף זמין במדריך בנושא מידע על כיול האנטנה.
גרפיקה
מפענח תמונות של NDK
ממשק ה-API ImageDecoder
של NDK מספק ממשק API רגיל לאפליקציות Android ב-C/C++ לצורך פענוח תמונות ישירות. מפתחי אפליקציות כבר לא צריכים להשתמש בממשקי ה-API של המסגרת (דרך JNI) או לצרף ספריות של צד שלישי לפענוח תמונות. למידע נוסף, קראו את המדריך למפתחים של Image decoder.
Frame rate API
ב-Android 11 יש ממשק API שמאפשר לאפליקציות להודיע למערכת על קצב הפריימים המתוכנן שלהן, כדי לצמצם את התנודות במכשירים שתומכים במספר שיעורי רענון. למידע נוסף על השימוש ב-API הזה, קראו את המדריך בנושא קצב פריימים.
בקשה ובדיקה של תמיכה בזמן אחזור קצר
מסכים מסוימים יכולים לבצע עיבוד גרפי לאחר העיבוד, כמו מסכים חיצוניים מסוימים וטלוויזיות. עיבוד התמונה הזה משפר את הגרפיקה, אבל יכול להגדיל את זמן האחזור. במסכים חדשים יותר שתומכים ב-HDMI 2.1 יש מצב אוטומטי עם זמן אחזור קצר (ALLM, שנקרא גם מצב משחק), שמפחית את זמן האחזור על ידי השבתת העיבוד לאחר הצגה. לפרטים נוספים על ALLM, אפשר לעיין במפרט HDMI 2.1.
חלון יכול לבקש שייעשה שימוש במצב זמן אחזור נמוך אוטומטי, אם הוא זמין. ALLM שימושי במיוחד לאפליקציות כמו משחקים ופגישות וידאו, שבהן זמן אחזור קצר חשוב יותר מהגרפיקה הטובה ביותר.
כדי להפעיל או להשבית עיבוד מינימלי לאחר העיבוד, קוראים לפונקציה Window.setPreferMinimalPostProcessing()
או מגדירים את המאפיין preferMinimalPostProcessing
של החלון לערך true
. לא כל המסכים תומכים בעיבוד מינימלי לאחר הצילום. כדי לבדוק אם מסך מסוים תומך בכך, צריך להפעיל את השיטה החדשה Display.isMinimalPostProcessingSupported()
.
הזרקה יעילה של שכבה לניפוי באגים בגרפיקה
עכשיו אפליקציות יכולות לטעון שכבות גרפיקה חיצוניות (GLES, Vulkan) לקוד האפליקציה המקורי כדי לחשוף את אותה פונקציונליות כמו באפליקציה שניתן לנפות באגים בה, אבל בלי לגרום לעומס יתר על הביצועים. התכונה הזו חשובה במיוחד כשאתם יוצרים פרופיל לאפליקציה באמצעות כלים כמו GAPID. כדי ליצור פרופיל של האפליקציה, צריך לכלול את רכיב המטא-נתונים הבא בקובץ המניפסט של האפליקציה במקום לאפשר ניפוי באגים באפליקציה:
<application ... > <meta-data android:name="com.android.graphics.injectLayers.enable" android:value="true" /> </application>
תמונות ומצלמה
השתקה של צלילים ורטט של התראות במהלך הצילום הפעיל
החל מגרסה 11 של Android, כשמשתמשים באופן פעיל במצלמה, אפשר להשתיק באפליקציה רק את הרטט, את הצלילים והרטט או את שניהם באמצעות setCameraAudioRestriction()
.
תמיכה מורחבת במצלמה במהדמ של Android
מידע על התמיכה המורחבת במצלמות במהדורת הסימולטור החל מ-Android 11 זמין במאמר תמיכה במצלמה.
תמיכה בשימוש בו-זמני ביותר ממצלמה אחת
ב-Android 11 נוספו ממשקי API לשליחת שאילתות לגבי תמיכה בשימוש ביותר ממצלמה אחת בכל פעם, כולל מצלמה קדמית ומצלמה אחורית.
כדי לבדוק אם יש תמיכה במכשיר שבו האפליקציה פועלת, תוכלו להשתמש בשיטות הבאות:
- הפונקציה
getConcurrentCameraIds()
מחזירהSet
של שילובים של מזהי מצלמות שיכולים לשדר בו-זמנית עם שילובי סטרימינג מובטחים כשהם מוגדרים על ידי אותו תהליך אפליקציה. isConcurrentSessionConfigurationSupported()
מבצע שאילתות כדי לבדוק אם מכשירי המצלמה יכולים לתמוך בו-זמנית בהגדרות הסשן המתאימות.
תמיכה משופרת בתמונות HEIF עם כמה מסגרות
החל מ-Android 11, אם קוראים ל-ImageDecoder.decodeDrawable()
ומעבירים תמונה בפורמט HEIF שמכילה רצף של מסגרות (כמו אנימציה או רצף תמונות), השיטה מחזירה AnimatedImageDrawable
שמכיל את כל רצף התמונות. בגרסאות קודמות של Android, ה-method החזיר BitmapDrawable
של פריים אחד בלבד.
אם הגרפיקה בפורמט HEIF מכילה כמה פריימים שלא מסודרים ברצף, אפשר לאחזר פריים ספציפי באמצעות קריאה ל-MediaMetadataRetriever.getImageAtIndex()
.
נגישות
עדכונים למפתחי שירותי נגישות
אם תיצרו שירות נגישות בהתאמה אישית, תוכלו להשתמש בתכונות הבאות ב-Android 11:
- ההסבר של שירות הנגישות שמוצג למשתמשים מאפשר עכשיו להשתמש ב-HTML ובתמונות בנוסף לטקסט פשוט. הגמישות הזו מאפשרת לכם להסביר למשתמשים הקצה מה השירות עושה ואיך הוא יכול לעזור להם.
- כדי לעבוד עם תיאור של מצב רכיב בממשק המשתמש שיש לו משמעות סמנטית יותר מ-
contentDescription
, צריך להפעיל את השיטהgetStateDescription()
. - כדי לבקש שאירועי מגע יעקפו את כלי הניווט במגע של המערכת, צריך להפעיל את הפונקציה
setTouchExplorationPassthroughRegion()
. באופן דומה, כדי לבקש שתנועות יעקפו את גלאי התנועות של המערכת, צריך להפעיל את הפונקציהsetGestureDetectionPassthroughRegion()
. - אפשר לבקש פעולות של IME, כמו 'enter' ו'next', וגם צילומי מסך של חלונות שלא מפעילים את הדגל
FLAG_SECURE
.
תכונות נוספות
סיבות ליציאה מתהליך האפליקציה
ב-Android 11 נוספה השיטה ActivityManager.getHistoricalProcessExitReasons()
, שמדווחת על הסיבות לסיום תהליכים שהתרחשו לאחרונה. אפליקציות יכולות להשתמש בשיטה הזו כדי לאסוף מידע אבחוני על קריסות, למשל כדי לבדוק אם סיום תהליך נובע מאירועי ANR, מבעיות זיכרון או מסיבות אחרות.
בנוסף, אפשר להשתמש בשיטה החדשה setProcessStateSummary()
כדי לאחסן מידע על מצב מותאם אישית לצורך ניתוח מאוחר יותר.
השיטה getHistoricalProcessExitReasons()
מחזירה מופעים של המחלקה ApplicationExitInfo
, שמכילה מידע שקשור לסיום של תהליך אפליקציה. אפשר להפעיל את getReason()
על מכונה של הכיתה הזו כדי לקבוע למה התהליך של האפליקציה הושמד. לדוגמה, ערך החזרה של REASON_CRASH
מציין שהתרחשה באפליקציה חריגה שלא טופלה. אם האפליקציה צריכה לוודא שהאירועים של סגירת האפליקציה ייחודיים, היא יכולה לשמור מזהה ייחודי לאפליקציה, כמו ערך גיבוב שמבוסס על חותמת הזמן מהשיטה getTimestamp()
.
מקורות מידע נוספים
מידע נוסף זמין במאמר בנושא כלים חדשים ב-Android 11 לשיפור הפרטיות והיציבות של האפליקציות ב-Medium.
מערכי טעינה של משאבים
ב-Android 11 נוסף ממשק API חדש שמאפשר לאפליקציות להרחיב באופן דינמי את האופן שבו מתבצע החיפוש והטעינה של המשאבים. הכיתות החדשות של ה-API ResourcesLoader
ו-ResourcesProvider
אחראיות בעיקר על הפונקציונליות החדשה. יחד, הם מספקים את היכולת לספק משאבים ונכסים נוספים, או לשנות את הערכים של משאבים ונכסים קיימים.
אובייקטים מסוג ResourcesLoader
הם קונטיינרים שמספקים אובייקטים מסוג ResourcesProvider
למכונה Resources
של האפליקציה. אובייקטים מסוג ResourcesProvider
מספקים שיטות לטעינה של נתוני משאבים מקובצי APK וטבלאות משאבים.
אחד מהתרחישים לדוגמה העיקריים לשימוש ב-API הזה הוא טעינת נכסים מותאמים אישית. אפשר להשתמש ב-loadFromDirectory()
כדי ליצור ResourcesProvider
שמנתב מחדש את הפתרון של משאבים ונכסים מבוססי-קובץ, כך שיתבצע חיפוש בתיקייה ספציפית במקום ב-APK של האפליקציה. אפשר לגשת לנכסים האלה באמצעות משפחת השיטות open()
מתוך סוג ה-API AssetManager
, בדיוק כמו לגשת לנכסים שמקובצים ב-APK.
APK Signature Scheme v4
ב-Android 11 נוספה תמיכה ב-APK Signature Scheme v4. התוכנית הזו יוצרת סוג חדש של חתימה בקובץ נפרד (apk-name.apk.idsig
), אבל היא דומה ל-v2 ול-v3 בכל שאר ההיבטים. לא מתבצעים שינויים בקובץ ה-APK. התוכנית הזו תומכת בהתקנה מצטברת של APK באמצעות ADB, שמאיצה את התקנת ה-APK.
מסנני כוונה דינמיים
כדי לקבל כוונות, האפליקציה צריכה להצהיר בזמן הידור אילו סוגי נתונים היא יכולה לקבל, על ידי הגדרת מסנן כוונות במניפסט של האפליקציה. ב-Android 10 ובגרסאות ישנות יותר, לאפליקציות אין אפשרות לשנות את מסנני הכוונה שלהן בזמן הריצה. זו בעיה לאפליקציות של וירטואליזציה (כמו מכונות וירטואליות ומחשבים מרוחקים), כי אין להן אפשרות לדעת בדיוק איזו תוכנה המשתמש יטמיע בהן.
ב-Android 11 מופיעות קבוצות MIME, רכיב חדש במניפסט שמאפשר לאפליקציה להצהיר על קבוצה דינמית של סוגי MIME במסנן Intent ולשנות אותה באופן פרוגרמטי בזמן הריצה. כדי להשתמש בקבוצת MIME, צריך לכלול אלמנט נתונים במניפסט של האפליקציה עם המאפיין החדש android:mimeGroup
:
<intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeGroup="myMimeGroup"/> </intent-filter>
הערך של המאפיין android:mimeGroup
הוא מזהה מחרוזת שרירותי שמזהה את קבוצת ה-MIME בזמן הריצה. כדי לגשת לתוכן של קבוצת MIME ולעדכן אותו, מעבירים את המזהה שלה לשיטות החדשות הבאות בכיתה API PackageManager
:
כשמוסיפים סוג MIME לקבוצת MIME באופן פרוגרמטי, הוא פועל בדיוק כמו סוג MIME סטטי שמוצהר במפורש במניפסט.
שיפורים במילוי האוטומטי
ב-Android 11 יש שיפורים בשירותי המילוי האוטומטי.
מזהי רמזים ב-AssistStructure.ViewNode
לעתים קרובות, שירותי מילוי אוטומטי מחשבים גיבוב חתימה של תצוגה מפורטת על סמך המאפיינים של התצוגה. הטיפ להצגה הוא מאפיין טוב במיוחד שאפשר לכלול בחישוב גיבוב החתימה, אבל מחרוזת הטיפ עשויה להשתנות בהתאם לאזור הגיאוגרפי של הטלפון. כדי לפתור את הבעיה, ב-Android 11 נוספה ל-AssistStructure.ViewNode
שיטה חדשה, getHintIdEntry()
, שמחזירה את מזהה המשאב של טקסט ההנחיה של תצוגה. השיטה הזו מספקת ערך שלא תלוי באזור גיאוגרפי, שאפשר להשתמש בו כדי לחשב גיבוב חתימות.
מערכי נתונים שמוצגים בהם אירועים
כדי לעזור לשירותי מילוי אוטומטי לשפר את ההצעות שלהם, ב-Android 11 יש דרך לזהות מקרים שבהם שירות מילוי אוטומטי הציג מערכי נתונים אבל המשתמש לא בחר אף אחד מהם. ב-Android 11, FillEventHistory
מדווח על סוג אירוע חדש, TYPE_DATASETS_SHOWN
. FillEventHistory
מתעד אירוע מהסוג הזה בכל פעם ששירות המילוי האוטומטי מציג למשתמש מערך נתונים אחד או יותר. שירותי מילוי אוטומטי יכולים להשתמש באירועים האלה בשילוב עם האירוע הקיים TYPE_DATASET_SELECTED
כדי לקבוע אם המשתמש בחר באחת מאפשרויות המילוי האוטומטי שסופקו.
שילוב IME
עכשיו אפשר להציג הצעות למילוי אוטומטי במקלדות ובממשקי IME אחרים בתוך השורה, בפס הצעות או בממשק דומה, במקום בתפריט נפתח. כדי להגן על מידע רגיש כמו סיסמאות ומספרי כרטיסי אשראי, ההצעות מוצגות למשתמש אבל לא ידועות ל-IME עד שהמשתמש בוחר אחת מהן. במאמר שילוב מילוי אוטומטי עם מקלדות מוסבר איך ממשקי IME ומנהלי סיסמאות יכולים לתמוך בתכונה הזו.
שיתוף נתונים עם שירות תיעוד התוכן
החל מ-Android 11, האפליקציה יכולה לשתף נתונים עם שירות תיעוד התוכן של המכשיר. בעזרת היכולת הזו, קל יותר למכשיר לספק מידע מודיעיני בהקשר, למשל הצגת שם השיר שמתנגן כרגע בסביבת המשתמש.
כדי לאפשר לשירות תיעוד התוכן לגשת לנתונים מהאפליקציה, צריך להפעיל את השיטה shareData()
במכונה של ContentCaptureManager
. אם המערכת תאשר את בקשת שיתוף הנתונים, האפליקציה תקבל מתאר קובץ לכתיבה בלבד כדי לשתף עם שירות צילום התוכן.