הוצאה משימוש של ניהול מכשירים. החל מ-Android 9 (רמת API 28), חלק ממדיניות האדמין יסומנו כהוצאה משימוש כשהן מופעלות על ידי אדמין של מכשיר. מומלץ להתחיל להתכונן לשינוי הזה כבר עכשיו. מידע נוסף על אפשרויות ההעברה זמין במאמר הוצאה משימוש של ניהול מכשירים.
Android כולל תמיכה באפליקציות לארגונים באמצעות Android Device Administration API. ממשק Device Administration API מספק תכונות לניהול מכשירים ברמת המערכת. ממשקי ה-API האלה מאפשרים ליצור אפליקציות עם מודעות לאבטחה, שימושיות בהגדרות ארגוניות שבהן אנשי IT צריכים שליטה נרחבת במכשירי העובדים. לדוגמה, אפליקציית האימייל המובנית של Android משתמשת בממשקי ה-API האלה כדי לשפר את התמיכה ב-Exchange. באמצעות אפליקציית האימייל, אדמינים של Exchange יכולים לאכוף מדיניות סיסמאות – כולל סיסמאות אלפאנומריות או קודי אימות מספריים – בכל המכשירים. אדמינים יכולים גם למחוק מרחוק (כלומר, לשחזר את הגדרות ברירת המחדל) מכשירים ניידים שאבדו או נגנבו. משתמשי Exchange יכולים לסנכרן את נתוני האימייל והיומן שלהם.
המסמך הזה מיועד למפתחים שרוצים לפתח פתרונות לארגונים למכשירים עם Android. במאמר מוסבר על התכונות השונות שמספק Device Administration API כדי לספק אבטחה חזקה יותר למכשירי עובדים שמבוססים על Android.
הערה למידע על יצירת בקר מדיניות עבודה לפריסות של Android for Work, אפשר לעיין במאמר יצירת בקר מדיניות מכשירים.
מצב ניהול ברמת בעלים של מכשיר ללא GUI
ב-Android 14 (רמת API 34) מוצג מצב Headless System User (מכשירים שבהם UserManager.isHeadlessSystemUserMode
מחזיר true
). במצב Headless System User, משתמש המערכת הוא משתמש ברקע והוא מסתמך על משתמשים נוספים בחזית לצורך אינטראקציה עם משתמש הקצה. ב-Android 14 נוסף גם מצב משויך של בעלות על מכשיר ללא ממשק משתמש, שמוסיף בעלות על פרופיל לכל המשתמשים המשויכים מלבד משתמש המערכת שמוגדר כבעלים של המכשיר.
במכשירים שהוגדרו עם משתמש מערכת ללא ממשק משתמש (שבו משתמש המערכת פועל ברקע), רק מדיניות המכשיר שהיא גלובלית בהיקף שלה (מדיניות שחלה על כל המשתמשים) מוחלת על המשתמשים בחזית. פרטים נוספים מופיעים במאמר בנושא addUserRestriction
.
יצרני מכשירי Android יכולים לעיין בהנחיות שפורסמו באתר source.android.com.
סקירה כללית של Device administration API
אלה דוגמאות לסוגי אפליקציות שעשויות להשתמש ב-Device Administration API:
- לקוחות אימייל.
- אפליקציות אבטחה שמבצעות איפוס מרחוק.
- אפליקציות ושירותים לניהול מכשירים.
איך זה עובד?
משתמשים בממשק Device Administration API כדי לכתוב אפליקציות לניהול מכשירים שהמשתמשים מתקינים במכשירים שלהם. האפליקציה לניהול המכשיר אוכפת את המדיניות הרצויה. ככה זה עובד:
- אדמין מערכת כותב אפליקציית אדמין למכשיר שאוכפת מדיניות אבטחה למכשיר מרחוק או באופן מקומי. יכול להיות שכללי המדיניות האלה מוטמעים באפליקציה, או שהאפליקציה מאחזרת באופן דינמי כללי מדיניות משרת של צד שלישי.
- האפליקציה מותקנת במכשירים של המשתמשים. בשלב הזה, אין ב-Android פתרון אוטומטי להקצאת הרשאות. הנה כמה דרכים שבהן אדמין יכול להפיץ את האפליקציה למשתמשים:
- Google Play.
- הפעלת ההתקנה מחנות אחרת.
- הפצת האפליקציה באמצעים אחרים, כמו אימייל או אתרים.
- המערכת מציגה למשתמש בקשה להפעיל את האפליקציה לניהול המכשיר. האופן שבו זה קורה והזמן שבו זה קורה תלויים באופן ההטמעה של האפליקציה.
- אחרי שהמשתמשים מפעילים את אפליקציית האדמין של המכשיר, הם כפופים למדיניות שלה. בדרך כלל, עמידה בדרישות המדיניות האלה מעניקה יתרונות כמו גישה למערכות ולנתונים רגישים.
אם המשתמשים לא מפעילים את האפליקציה לניהול המכשיר, היא נשארת במכשיר אבל במצב לא פעיל. המשתמשים לא יהיו כפופים למדיניות שלה, ולא יוכלו ליהנות מהיתרונות של האפליקציה – למשל, הם לא יוכלו לסנכרן נתונים.
אם משתמש לא פועל בהתאם למדיניות (לדוגמה, אם משתמש מגדיר סיסמה שמפרה את ההנחיות), האפליקציה היא זו שמחליטה איך לטפל בזה. עם זאת, בדרך כלל זה יגרום לכך שהמשתמש לא יוכל לסנכרן את הנתונים.
אם מכשיר ינסה להתחבר לשרת שדורש מדיניות שלא נתמכת ב-Device Administration API, החיבור לא יאושר. בשלב הזה, Device Administration API לא מאפשר הקצאת הרשאות חלקית. במילים אחרות, אם מכשיר (למשל, מכשיר מדור קודם) לא תומך בכל המדיניות שצוינה, אין אפשרות לאפשר למכשיר להתחבר.
אם במכשיר יש כמה אפליקציות אדמין מופעלות, המדיניות המחמירה ביותר נאכפת. אין אפשרות לטרגט אפליקציית אדמין מסוימת.
כדי להסיר אפליקציית אדמין קיימת במכשיר, המשתמשים צריכים קודם לבטל את הרישום של האפליקציה כאדמין.
מדיניות
בסביבה ארגונית, לעיתים קרובות המכשירים של העובדים צריכים לפעול בהתאם למערכת מחמירה של כללי מדיניות ששולטים בשימוש במכשיר. ממשק Device Administration API תומך במדיניות שמפורטת בטבלה 1. הערה: נכון לעכשיו, Device Administration API תומך רק בסיסמאות לביטול הנעילה של המסך:
טבלה 1. מדיניות שנתמכת על ידי Device Administration API.
מדיניות | תיאור |
---|---|
הסיסמה הופעלה | ההגדרה מחייבת שהמכשירים יבקשו קוד אימות או סיסמאות. |
אורך סיסמה מינימלי | הגדרת מספר התווים הנדרש לסיסמה. לדוגמה, אפשר לדרוש שקוד האימות או הסיסמאות יכללו לפחות שישה תווים. |
נדרשת סיסמה אלפאנומרית | הסיסמאות חייבות להכיל שילוב של אותיות ומספרים. הם יכולים לכלול תווים סמליים. |
נדרשת סיסמה מורכבת | הסיסמאות חייבות להכיל לפחות אות אחת, ספרה אחת וסמל מיוחד אחד. הוצג ב-Android 3.0. |
מספר האותיות המינימלי שנדרש בסיסמה | מספר האותיות המינימלי שנדרש בסיסמה של כל האדמינים או של אדמין מסוים. הוצג ב-Android 3.0. |
מספר מינימלי של אותיות קטנות שנדרש בסיסמה | מספר האותיות הקטנות המינימלי שנדרש בסיסמה של כל האדמינים או של אדמין מסוים. הוצג ב-Android 3.0. |
מספר מינימלי של תווים שאינם אותיות שנדרשים בסיסמה | מספר התווים המינימלי שאינם אותיות שנדרש בסיסמה של כל האדמינים או של אדמין מסוים. הוצג ב-Android 3.0. |
מספר הספרות המינימלי שנדרש בסיסמה | מספר הספרות המינימלי שנדרש בסיסמה של כל האדמינים או של אדמין מסוים. הוצג ב-Android 3.0. |
מספר מינימלי של סמלים שנדרשים בסיסמה | מספר הסמלים המינימלי שנדרש בסיסמה של כל האדמינים או של אדמין מסוים. הוצג ב-Android 3.0. |
מספר מינימלי של אותיות רישיות שנדרש בסיסמה | מספר האותיות הרישיות המינימלי שנדרש בסיסמה של כל האדמינים או של אדמין מסוים. הוצג ב-Android 3.0. |
הזמן הקצוב לתפוגת התוקף של הסיסמה | הזמן שבו הסיסמה תפוג, כהפרש באלפיות שנייה מהזמן שבו אדמין המכשיר מגדיר את פסק הזמן לתפוגה. הוצג ב-Android 3.0. |
הגבלה של היסטוריית הסיסמאות | המדיניות הזו מונעת מהמשתמשים לעשות שימוש חוזר ב-n הסיסמאות האחרונות והייחודיות.
בדרך כלל משתמשים במדיניות הזו בשילוב עם setPasswordExpirationTimeout() , שמאלצת את המשתמשים לעדכן את הסיסמאות שלהם אחרי שחלף פרק זמן מסוים.
הוצג ב-Android 3.0. |
מספר הניסיונות המקסימלי הכושלים להזנת סיסמה | ההגדרה קובעת כמה פעמים משתמש יכול להזין סיסמה שגויה לפני שהנתונים במכשיר יימחקו. ממשק ה-API לניהול מכשירים מאפשר לאדמינים גם לאפס מרחוק את המכשיר להגדרות ברירת המחדל. כך הנתונים יהיו מאובטחים במקרה שהמכשיר יאבד או ייגנב. |
זמן מקסימלי ללא פעילות לפני נעילה | ההגדרה קובעת את משך הזמן שעבר מאז שהמשתמש נגע במסך או לחץ על לחצן, לפני שהמכשיר נועל את המסך. במקרה כזה, המשתמשים צריכים להזין שוב את קוד האימות או הסיסמאות שלהם כדי להשתמש במכשירים ולגשת לנתונים. הערך יכול להיות בין דקה אחת ל-60 דקות. |
דרישה להצפנת אחסון | המדיניות הזו מציינת שאזור האחסון צריך להיות מוצפן, אם המכשיר תומך בכך. הוצג ב-Android 3.0. |
השבתת המצלמה | המדיניות הזו מציינת שהמצלמה צריכה להיות מושבתת. חשוב לזכור שלא חייבים להשבית את החשבון באופן סופי. אפשר להפעיל או להשבית את המצלמה באופן דינמי על סמך ההקשר, השעה וכו'. הוצג ב-Android 4.0. |
תכונות אחרות
בנוסף לתמיכה במדיניות שמפורטת בטבלה שלמעלה, Device Administration API מאפשר לכם לבצע את הפעולות הבאות:
- הצגת בקשה למשתמש להגדיר סיסמה חדשה.
- נעילת המכשיר באופן מיידי.
- מחיקת הנתונים במכשיר (כלומר, החזרת המכשיר להגדרות ברירת המחדל של היצרן).
אפליקציה לדוגמה
הדוגמאות שמופיעות בדף הזה מבוססות על דוגמה של Device Administration API, שכלולה בדוגמאות של SDK (זמינות דרך Android SDK Manager) וממוקמת במערכת שלכם בנתיב <sdk_root>/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java
.
אפליקציית הדוגמה מציעה הדגמה של תכונות האדמין של המכשיר. האפליקציה מציגה למשתמשים ממשק משתמש שמאפשר להם להפעיל את אפליקציית האדמין של המכשיר. אחרי שהם מפעילים את האפליקציה, הם יכולים להשתמש בלחצנים בממשק המשתמש כדי לבצע את הפעולות הבאות:
- הגדרת איכות הסיסמה.
- מציינים את הדרישות לסיסמה של המשתמש, כמו אורך מינימלי, מספר מינימלי של תווים מספריים שהיא צריכה להכיל וכו'.
- מגדירים את הסיסמה. אם הסיסמה לא עומדת בדרישות המדיניות שצוינו, המערכת מחזירה שגיאה.
- מגדירים כמה ניסיונות התחברות כושלים יכולים להתרחש לפני שמבצעים איפוס נתוני המכשיר (כלומר, שחזור להגדרות המקוריות).
- הגדרת משך הזמן מעכשיו ועד שתוקף הסיסמה יפוג.
- מגדירים את אורך היסטוריית הסיסמאות (length מתייחס למספר הסיסמאות הישנות שמאוחסנות בהיסטוריה). כך המשתמשים לא יוכלו להשתמש מחדש באחת מn הסיסמאות האחרונות שהם השתמשו בהן בעבר.
- מציינים אם אזור האחסון צריך להיות מוצפן, אם המכשיר תומך בכך.
- מגדירים את משך הזמן המקסימלי של חוסר פעילות שיכול לעבור לפני שהמכשיר יינעל.
- לגרום לנעילת המכשיר באופן מיידי.
- מחיקת נתוני המכשיר (כלומר, שחזור ההגדרות המקוריות).
- משביתים את המצלמה.

איור 1. צילום מסך של האפליקציה לדוגמה
פיתוח אפליקציה לניהול מכשירים
אדמינים של המערכת יכולים להשתמש ב-Device Administration API כדי לכתוב אפליקציה שמבצעת אכיפה של מדיניות אבטחה במכשיר מרחוק או באופן מקומי. בקטע הזה מפורטים השלבים ליצירת אפליקציה לניהול מכשירים.
יצירת קובץ המניפסט
כדי להשתמש ב-Device Administration API, במניפסט של האפליקציה צריך לכלול את הדברים הבאים:
- מחלקת משנה של
DeviceAdminReceiver
שכוללת את הפריטים הבאים:- ההרשאה
BIND_DEVICE_ADMIN
. - היכולת להגיב ל-Intent
ACTION_DEVICE_ADMIN_ENABLED
שמופיע במניפסט כמסנן Intent.
- ההרשאה
- הצהרה על מדיניות האבטחה שנעשה בה שימוש במטא-נתונים.
קטע מתוך מניפסט לדוגמה של ניהול מכשירים:
<activity android:name=".app.DeviceAdminSample" android:label="@string/activity_sample_device_admin"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.SAMPLE_CODE" /> </intent-filter> </activity> <receiver android:name=".app.DeviceAdminSample$DeviceAdminSampleReceiver" android:label="@string/sample_device_admin" android:description="@string/sample_device_admin_description" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_sample" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver>
חשוב לדעת:
- המאפיינים הבאים מתייחסים למשאבי מחרוזות שנמצאים ב-
ApiDemos/res/values/strings.xml
באפליקציה לדוגמה. מידע נוסף על משאבים זמין במאמר משאבי אפליקציות.-
android:label="@string/activity_sample_device_admin"
מתייחס לתווית של הפעילות שקלה לקריאה על ידי המשתמש. -
android:label="@string/sample_device_admin"
מתייחס לתווית שהמשתמש יכול לקרוא עבור ההרשאה. -
android:description="@string/sample_device_admin_description"
מתייחס לתיאור ההרשאה שקריא למשתמש. בדרך כלל תיאור ארוך יותר ותיבת התיוג.
-
-
android:permission="android.permission.BIND_DEVICE_ADMIN"
היא הרשאה שחייבת להיות למחלקת משנה שלDeviceAdminReceiver
, כדי להבטיח שרק המערכת תוכל לקיים אינטראקציה עם המקלט (אי אפשר להעניק את ההרשאה הזו לאף אפליקציה). כך אפליקציות אחרות לא יוכלו לנצל לרעה את האפליקציה לניהול המכשיר. -
android.app.action.DEVICE_ADMIN_ENABLED
היא הפעולה העיקרית שצריך לטפל בה במחלקת משנה שלDeviceAdminReceiver
כדי לקבל הרשאה לנהל מכשיר. ההגדרה הזו מוגדרת למקלט כשהמשתמש מפעיל את אפליקציית האדמין של המכשיר. בדרך כלל הקוד מטפל בזה ב-onEnabled()
. כדי שהאפשרות הזו תהיה רלוונטית, גם הנמען צריך לדרוש את ההרשאהBIND_DEVICE_ADMIN
, כדי שאפליקציות אחרות לא יוכלו לנצל אותה לרעה. - כשמשתמש מפעיל את אפליקציית ניהול המכשיר, הוא מעניק למקבל הרשאה לבצע פעולות בתגובה לשידור של אירועים ספציפיים במערכת. כשיש אירוע מתאים, האפליקציה יכולה להחיל מדיניות. לדוגמה, אם המשתמש מנסה להגדיר סיסמה חדשה שלא עומדת בדרישות המדיניות, האפליקציה יכולה להציג למשתמש הנחיה לבחור סיסמה אחרת שעומדת בדרישות.
- מומלץ להימנע משינוי שם המקלט אחרי פרסום האפליקציה. אם השם במניפסט משתנה, ניהול המכשיר מושבת כשהמשתמשים מעדכנים את האפליקציה. מידע נוסף זמין במאמר
<receiver>
. android:resource="@xml/device_admin_sample"
מצהיר על מדיניות האבטחה שנעשה בה שימוש במטא-נתונים. המטא-נתונים מספקים מידע נוסף שספציפי לאדמין של המכשיר, כפי שנותח על ידי המחלקהDeviceAdminInfo
. הנה התוכן שלdevice_admin_sample.xml
:
<device-admin xmlns:android="http://schemas.android.com/apk/res/android"> <uses-policies> <limit-password /> <watch-login /> <reset-password /> <force-lock /> <wipe-data /> <expire-password /> <encrypted-storage /> <disable-camera /> </uses-policies> </device-admin>
כשמעצבים אפליקציה לניהול מכשירים, לא צריך לכלול את כל כללי המדיניות, אלא רק את אלה שרלוונטיים לאפליקציה.
מידע נוסף על קובץ המניפסט זמין במדריך למפתחים של Android.הטמעת הקוד
Device Administration API כולל את המחלקות הבאות:
DeviceAdminReceiver
- מחלקת בסיס להטמעה של רכיב ניהול מכשירים. המחלקות האלה מספקות נוחות בפירוש פעולות הכוונה הגולמיות שנשלחות על ידי המערכת. אפליקציית ניהול המכשיר צריכה לכלול מחלקת משנה
DeviceAdminReceiver
. DevicePolicyManager
- מחלקת מדיניות לניהול כללי מדיניות שנאכפים במכשיר. לרוב הלקוחות של המחלקה הזו צריך להיות
DeviceAdminReceiver
שפורסם והמשתמש הפעיל אותו כרגע. DevicePolicyManager
מנהל את המדיניות עבור מכונה אחת או יותר שלDeviceAdminReceiver
DeviceAdminInfo
- המחלקות האלה משמשות לציון מטא-נתונים של רכיב אדמין במכשיר.
המחלקות האלה מספקות את הבסיס לאפליקציה לניהול מכשירים שפועלת באופן מלא.DeviceAdminReceiver
DevicePolicyManager
בהמשך הקטע הזה מוסבר איך משתמשים בממשקי ה-API DeviceAdminReceiver
ו-DevicePolicyManager
כדי לכתוב אפליקציה לניהול מכשירים.
יצירת מחלקה משנית של DeviceAdminReceiver
כדי ליצור אפליקציית אדמין במכשיר, צריך ליצור מחלקת משנה של DeviceAdminReceiver
. המחלקות DeviceAdminReceiver
מורכבות מסדרה של קריאות חוזרות (callback) שמופעלות כשמתרחשים אירועים מסוימים.
במחלקת המשנה DeviceAdminReceiver
, אפליקציית הדוגמה פשוט מציגה התראה Toast
בתגובה לאירועים מסוימים. לדוגמה:
Kotlin
class DeviceAdminSample : DeviceAdminReceiver() { private fun showToast(context: Context, msg: String) { context.getString(R.string.admin_receiver_status, msg).let { status -> Toast.makeText(context, status, Toast.LENGTH_SHORT).show() } } override fun onEnabled(context: Context, intent: Intent) = showToast(context, context.getString(R.string.admin_receiver_status_enabled)) override fun onDisableRequested(context: Context, intent: Intent): CharSequence = context.getString(R.string.admin_receiver_status_disable_warning) override fun onDisabled(context: Context, intent: Intent) = showToast(context, context.getString(R.string.admin_receiver_status_disabled)) override fun onPasswordChanged(context: Context, intent: Intent, userHandle: UserHandle) = showToast(context, context.getString(R.string.admin_receiver_status_pw_changed)) ... }
Java
public class DeviceAdminSample extends DeviceAdminReceiver { void showToast(Context context, String msg) { String status = context.getString(R.string.admin_receiver_status, msg); Toast.makeText(context, status, Toast.LENGTH_SHORT).show(); } @Override public void onEnabled(Context context, Intent intent) { showToast(context, context.getString(R.string.admin_receiver_status_enabled)); } @Override public CharSequence onDisableRequested(Context context, Intent intent) { return context.getString(R.string.admin_receiver_status_disable_warning); } @Override public void onDisabled(Context context, Intent intent) { showToast(context, context.getString(R.string.admin_receiver_status_disabled)); } @Override public void onPasswordChanged(Context context, Intent intent, UserHandle userHandle) { showToast(context, context.getString(R.string.admin_receiver_status_pw_changed)); } ... }
הפעלת האפליקציה
אחד מהאירועים העיקריים שאפליקציית אדמין במכשיר צריכה לטפל בהם הוא הפעלת האפליקציה על ידי המשתמש. המשתמש צריך להפעיל את האפליקציה באופן מפורש כדי שהמדיניות תיאכף. אם המשתמש יבחר לא להפעיל את האפליקציה, היא עדיין תופיע במכשיר, אבל המדיניות שלה לא תיאכף והמשתמש לא יוכל ליהנות מהיתרונות שלה.
תהליך ההפעלה של האפליקציה מתחיל כשהמשתמש מבצע פעולה שמפעילה את כוונת ACTION_ADD_DEVICE_ADMIN
. באפליקציה לדוגמה, זה קורה כשהמשתמש לוחץ על תיבת הסימון Enable Admin.
כשהמשתמש לוחץ על תיבת הסימון הפעלת אדמין, התצוגה משתנה ומוצגת בקשה למשתמש להפעיל את אפליקציית האדמין של המכשיר, כמו שמוצג באיור 2.

איור 2. אפליקציה לדוגמה: הפעלת האפליקציה
בהמשך מופיע הקוד שמופעל כשמשתמש לוחץ על תיבת הסימון הפעלת אדמין. הפעולה הזו תפעיל את הקריאה החוזרת onPreferenceChange()
. הקריאה החוזרת הזו מופעלת כשהמשתמש משנה את הערך של Preference
, והמערכת עומדת להגדיר אותו או לשמור אותו. אם המשתמש מפעיל את האפליקציה, התצוגה משתנה ומבקשת מהמשתמש להפעיל את אפליקציית האדמין של המכשיר, כמו שמוצג באיור 2. אחרת, האפליקציה לניהול המכשיר מושבתת.
Kotlin
override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean { if (super.onPreferenceChange(preference, newValue)) return true val value = newValue as Boolean if (preference == enableCheckbox) { if (value != adminActive) { if (value) { // Launch the activity to have the user enable our admin. val intent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN).apply { putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample) putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, activity.getString(R.string.add_admin_extra_app_text)) } startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN) // return false - don't update checkbox until we're really active return false } else { dpm.removeActiveAdmin(deviceAdminSample) enableDeviceCapabilitiesArea(false) adminActive = false } } } else if (preference == disableCameraCheckbox) { dpm.setCameraDisabled(deviceAdminSample, value) } return true }
Java
@Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (super.onPreferenceChange(preference, newValue)) { return true; } boolean value = (Boolean) newValue; if (preference == enableCheckbox) { if (value != adminActive) { if (value) { // Launch the activity to have the user enable our admin. Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, activity.getString(R.string.add_admin_extra_app_text)); startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN); // return false - don't update checkbox until we're really active return false; } else { dpm.removeActiveAdmin(deviceAdminSample); enableDeviceCapabilitiesArea(false); adminActive = false; } } } else if (preference == disableCameraCheckbox) { dpm.setCameraDisabled(deviceAdminSample, value); } return true; }
בשורה intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
mDeviceAdminSample)
מצוין שמדיניות היעד היא mDeviceAdminSample
(שהיא רכיב DeviceAdminReceiver
).
השורה הזו מפעילה את ממשק המשתמש שמוצג באיור 2, שמנחה את המשתמשים בתהליך של הוספת אדמין למכשיר למערכת (או מאפשר להם לדחות את ההוספה).
כשהאפליקציה צריכה לבצע פעולה שתלויה בהפעלת אפליקציית האדמין של המכשיר, היא מוודאת שהאפליקציה פעילה. לשם כך, הוא משתמש בשיטה DevicePolicyManager
isAdminActive()
. שימו לב שהשיטה DevicePolicyManager
isAdminActive()
מקבלת רכיב DeviceAdminReceiver
כארגומנט:
Kotlin
private lateinit var dpm: DevicePolicyManager ... private fun isActiveAdmin(): Boolean = dpm.isAdminActive(deviceAdminSample)
Java
DevicePolicyManager dpm; ... private boolean isActiveAdmin() { return dpm.isAdminActive(deviceAdminSample); }
ניהול המדיניות
DevicePolicyManager
היא מחלקה ציבורית לניהול מדיניות שנאכפת במכשיר. DevicePolicyManager
מנהל מדיניות עבור מופע אחד או יותר של DeviceAdminReceiver
.
כך מקבלים נקודת אחיזה ל-DevicePolicyManager
:
Kotlin
dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
Java
DevicePolicyManager dpm = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
בקטע הזה מוסבר איך משתמשים ב-DevicePolicyManager
כדי לבצע משימות ניהוליות:
הגדרת מדיניות לסיסמאות
DevicePolicyManager
כולל ממשקי API להגדרת מדיניות הסיסמאות במכשיר ולאכיפתה. ב-Device Administration API, הסיסמה רלוונטית רק לנעילת המסך. בקטע הזה מתוארות משימות נפוצות שקשורות לסיסמאות.
הגדרת סיסמה למכשיר
הקוד הזה מציג ממשק משתמש שמבקש מהמשתמש להגדיר סיסמה:
Kotlin
Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent -> startActivity(intent) }
Java
Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD); startActivity(intent);
הגדרת איכות הסיסמה
איכות הסיסמה יכולה להיות אחת מהקבועים הבאים של DevicePolicyManager
:
PASSWORD_QUALITY_ALPHABETIC
- המשתמש צריך להזין סיסמה שמכילה לפחות תווים אלפביתיים (או סמלים אחרים).
PASSWORD_QUALITY_ALPHANUMERIC
- המשתמש צריך להזין סיסמה שמכילה לפחות גם תווים מספריים וגם תווים אלפביתיים (או סמלים אחרים).
PASSWORD_QUALITY_NUMERIC
- המשתמש צריך להזין סיסמה שמכילה לפחות תווים מספריים.
PASSWORD_QUALITY_COMPLEX
- המשתמש צריך להזין סיסמה שמכילה לפחות אות אחת, ספרה אחת וסמל מיוחד אחד.
PASSWORD_QUALITY_SOMETHING
- המדיניות דורשת סיסמה כלשהי, אבל לא משנה איזו.
PASSWORD_QUALITY_UNSPECIFIED
- אין דרישות לסיסמה במדיניות.
לדוגמה, כך מגדירים את מדיניות הסיסמאות כך שתידרש סיסמה אלפאנומרית:
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
הגדרת דרישות לתוכן הסיסמה
החל מ-Android 3.0, המחלקה DevicePolicyManager
כוללת שיטות שמאפשרות לכוונן את התוכן של הסיסמה. לדוגמה, אפשר להגדיר מדיניות שקובעת שסיסמאות צריכות להכיל לפחות n אותיות רישיות. אלה השיטות לשיפור הסיסמה:
setPasswordMinimumLetters()
setPasswordMinimumLowerCase()
setPasswordMinimumUpperCase()
setPasswordMinimumNonLetter()
setPasswordMinimumNumeric()
setPasswordMinimumSymbols()
לדוגמה, בקטע הקוד הזה מצוין שהסיסמה צריכה לכלול לפחות 2 אותיות רישיות:
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwMinUppercase = 2 ... dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; int pwMinUppercase = 2; ... dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase);
הגדרת האורך המינימלי של הסיסמה
אתם יכולים לציין שהסיסמה צריכה להיות באורך המינימלי שצוין לפחות. לדוגמה:
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwLength: Int = ... ... dpm.setPasswordMinimumLength(deviceAdminSample, pwLength)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; int pwLength; ... dpm.setPasswordMinimumLength(deviceAdminSample, pwLength);
הגדרת מספר מקסימלי של ניסיונות כושלים להזנת סיסמה
אתם יכולים להגדיר את המספר המקסימלי של ניסיונות כושלים להזנת סיסמה לפני שנתוני המכשיר יאופסו (כלומר, יוחזרו להגדרות המקוריות). לדוגמה:
Kotlin
val dPM:DevicePolicyManager private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val maxFailedPw: Int = ... ... dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; int maxFailedPw; ... dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw);
הגדרת זמן קצוב לתפוגת סיסמה
החל מ-Android 3.0, אפשר להשתמש בשיטה
setPasswordExpirationTimeout()
כדי להגדיר מתי תוקף הסיסמה יפוג. התוקף מוגדר כהפרש באלפיות השנייה מהרגע שבו מנהל המכשיר מגדיר את הזמן הקצוב לתפוגה. לדוגמה:
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwExpiration: Long = ... ... dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; long pwExpiration; ... dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration);
הגבלת סיסמאות על סמך היסטוריה
החל מ-Android 3.0, אפשר להשתמש בשיטה setPasswordHistoryLength()
כדי להגביל את היכולת של המשתמשים לעשות שימוש חוזר בסיסמאות ישנות. ה-method הזה מקבל פרמטר length, שמציין כמה סיסמאות ישנות מאוחסנות. כשהמדיניות הזו פעילה, המשתמשים לא יכולים להזין סיסמה חדשה שתהיה זהה ל-n הסיסמאות האחרונות. כך המשתמשים לא יוכלו להשתמש באותה סיסמה שוב ושוב. בדרך כלל משתמשים במדיניות הזו בשילוב עם setPasswordExpirationTimeout()
, שמאלצת את המשתמשים לעדכן את הסיסמאות שלהם אחרי שחלף פרק זמן מסוים.
לדוגמה, הקטע הבא אוסר על המשתמשים לעשות שימוש חוזר ב-5 הסיסמאות האחרונות שלהם:
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwHistoryLength = 5 ... dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; int pwHistoryLength = 5; ... dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength);
הגדרת השיטה לביטול נעילת המכשיר
אפשר להגדיר את התקופה המקסימלית של חוסר פעילות של המשתמש שיכולה להתרחש לפני שהמכשיר יינעל. לדוגמה:
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val timeMs: Long = 1000L * timeout.text.toString().toLong() ... dpm.setMaximumTimeToLock(deviceAdminSample, timeMs)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... long timeMs = 1000L*Long.parseLong(timeout.getText().toString()); dpm.setMaximumTimeToLock(deviceAdminSample, timeMs);
אפשר גם לתכנת את המכשיר כך שיינעל באופן מיידי:
Kotlin
private lateinit var dpm: DevicePolicyManager dpm.lockNow()
Java
DevicePolicyManager dpm; dpm.lockNow();
איפוס הנתונים
אתם יכולים להשתמש בשיטה DevicePolicyManager
wipeData()
כדי לאפס את המכשיר להגדרות המקוריות. האפשרות הזו שימושית אם המכשיר אבד או נגנב. לרוב, ההחלטה לאפס את הנתונים במכשיר מתקבלת אחרי שמתקיימים תנאים מסוימים. לדוגמה, אפשר להשתמש ב-setMaximumFailedPasswordsForWipe()
כדי לציין שמכשיר צריך להימחק אחרי מספר מסוים של ניסיונות כושלים להזנת סיסמה.
כך מאפסים את הנתונים:
Kotlin
private lateinit var dpm: DevicePolicyManager dpm.wipeData(0)
Java
DevicePolicyManager dpm; dpm.wipeData(0);
השיטה wipeData()
מקבלת כפרמטר מסכת ביטים של אפשרויות נוספות. הערך חייב להיות 0.
השבתת המצלמה
החל מ-Android 4.0, אפשר להשבית את המצלמה. הערה: לא חייבים להשבית את החשבון באופן קבוע. אפשר להפעיל או להשבית את המצלמה באופן דינמי בהתאם להקשר, לשעה וכו'.
אתם קובעים אם המצלמה מושבתת באמצעות השיטה setCameraDisabled()
. לדוגמה, בקטע הקוד הבא המצלמה מופעלת או מושבתת בהתאם להגדרה של תיבת סימון:
Kotlin
private lateinit var disableCameraCheckbox: CheckBoxPreference private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked)
Java
private CheckBoxPreference disableCameraCheckbox; DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked());
הצפנת האחסון
החל מ-Android 3.0, אפשר להשתמש בשיטה setStorageEncryption()
כדי להגדיר מדיניות שמחייבת הצפנה של אזור האחסון, במקומות שבהם היא נתמכת.
לדוגמה:
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setStorageEncryption(deviceAdminSample, true)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setStorageEncryption(deviceAdminSample, true);
דוגמה מלאה להפעלת הצפנת אחסון מופיעה בדוגמה של Device Administration API.
דוגמאות קוד נוספות
בדוגמאות Android AppRestrictionEnforcer ו-DeviceOwner מוצגות דוגמאות נוספות לשימוש בממשקי ה-API שמוסברים בדף הזה.