הוצאה משימוש של 'ניהול מכשירים' החל מ-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) חדש מצב משתמש במערכת ללא ממשק גרפי (GUI) (מכשירים ב-
איזה
UserManager.isHeadlessSystemUserMode
מחזירה true
). במצב משתמש במערכת ללא ממשק גרפי, משתמש המערכת
משתמש ברקע, מסתמכת על משתמשים נוספים שפועלים בחזית עבור משתמשי הקצה
אינטראקציה חוזרת. Android 14 כולל גם
מצב שיוך לבעלי מכשיר ללא GUI,
פעולה שמוסיפה בעלי פרופיל לכל
משתמשים משויכים
מלבד משתמש המערכת שבו מוגדר בעלי המכשיר.
במכשירים שהוגדרו עם משתמש במערכת ללא GUI (שבו משתמש המערכת
פועלת ברקע), רק כללי מדיניות המכשיר שהוגדרו באופן גלובלי
(כללי המדיניות שחלים על כל המשתמשים) חלים על המשתמש שפועל בחזית
או משתמשים. לפרטים נוספים, ראו addUserRestriction
.
יצרנים של מכשירי Android עשויים לעיין הנחיות פורסם בכתובת source.android.com.
סקירה כללית על Device Admin API
ריכזנו כאן דוגמאות לסוגי האפליקציות שעשויות להשתמש ב-Device Administration API:
- לשלוח אימיילים ללקוחות.
- אפליקציות אבטחה עם מחיקה מרחוק.
- אפליקציות ושירותים לניהול מכשירים.
איך זה עובד?
משתמשים ב-Device Administration API כדי לכתוב אפליקציות אדמין של מכשירים שהמשתמשים מתקינים במכשירים שלהם. האפליקציה לניהול המכשיר אוכפת את כללי המדיניות הרצויים. כך זה עובד:
- אדמין כותב אפליקציה לניהול המכשיר שאוכפת כללי מדיניות לאבטחת מכשיר מרוחק/מקומי. ניתן לקודד את כללי המדיניות האלה בתוך הקוד האפליקציה, או האפליקציה יכולה לאחזר באופן דינמי כללי מדיניות מצד שלישי השרת.
- האפליקציה מותקנת במכשירים של המשתמשים מכשירים. בשלב זה אין ל-Android פתרון אוטומטי להקצאה. חלק מהדרכים שבהן מנהל מערכת עשוי
הפצת האפליקציה למשתמשים:
- Google Play.
- הפעלת האפשרות להתקנה מחנות אחרת.
- הפצת האפליקציה באמצעים אחרים, כמו אימייל או אתרים.
- המערכת מבקשת מהמשתמש להפעיל את האפליקציה לניהול המכשיר. האופן שבו זה קורה ותזמון האירוע משתנים בהתאם לאופן שבו האפליקציה מוטמעת.
- אחרי שהמשתמשים מפעילים את אפליקציית האדמין של המכשיר, הם כפופים לכללי המדיניות שלה. ציות למדיניות הזו בדרך כלל מעניק יתרונות, כמו גישה למערכות ולנתונים רגישים.
אם המשתמשים לא מפעילים את האפליקציה לניהול המכשיר, היא נשארת במכשיר אבל במצב לא פעיל. המשתמשים לא יהיו כפופים למדיניות של האפליקציה, ובתמורה הם לא יקבלו את היתרונות של האפליקציה – לדוגמה, יכול להיות שהם לא יוכלו לסנכרן נתונים.
אם משתמש לא מציית למדיניות (לדוגמה, אם משתמש מגדיר סיסמה שמפירה את ההנחיות), הבעלים של האפליקציה מחליט איך לטפל בבעיה. עם זאת, בדרך כלל המשתמש לא יוכל לסנכרן נתונים.
אם מכשיר ינסה להתחבר לשרת שדורש מדיניות שלא נתמכת ב-Device Administration API, החיבור לא יאושר. נכון לעכשיו, Device Administration API לא מאפשר שימוש חלקי הקצאה. במילים אחרות, אם מכשיר (למשל, מכשיר מדור קודם) לא תומך בכל כללי המדיניות שצוינו, אי אפשר לאפשר למכשיר להתחבר.
אם במכשיר יש כמה אפליקציות אדמין מופעלות, המדיניות המחמירה ביותר היא אכיפה. אין דרך לטרגט אדמין מסוים אפליקציה.
כדי להסיר אפליקציית אדמין קיימת במכשיר, המשתמשים צריכים לבטל את הרישום שלה כאדמין.
מדיניות
בסביבה ארגונית, לרוב קורה שמכשירים של עובדים צריכים לפעול בהתאם לקבוצה מחמירה של כללי מדיניות שחלים על השימוש במכשיר. Device Administration API תומך בכללי המדיניות שמפורטים בטבלה 1. לתשומת ליבך: נכון לעכשיו, Device Administration API תומך בסיסמאות במסך בלבד lock:
טבלה 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. |
מספר ניסיונות כושלים להזנת סיסמה | מציין כמה פעמים משתמש יכול להזין סיסמה שגויה לפני במכשיר עצמו. Device Administration API גם מאפשר למנהלי המערכת לאפס מרחוק את המכשיר להגדרות ברירת המחדל של היצרן. כך תוכלו לאבטח את הנתונים במקרה שהמכשיר יאבד או יגנב. |
נעילה לאחר זמן חוסר פעילות מקסימלי | ההגדרה קובעת את משך הזמן מהפעם האחרונה שהמשתמש נגע במסך או לחץ על לחצן עד שהמסך יינעל. במצב כזה, המשתמשים יצטרכו להזין שוב את קוד האימות או את הסיסמאות לפני שיוכלו להשתמש במכשירים גישה לנתונים. הערך יכול להיות בין דקה אחת ל-60 דקות. |
דרישה להצפנת אחסון | מציין שצריך להצפין את אזור האחסון, אם המכשיר תומך בכך. הופיעה לראשונה ב-Android 3.0. |
השבתת המצלמה | מציין שצריך להשבית את המצלמה. לתשומת ליבכם: תהיה השבתה סופית. ניתן להפעיל/להשבית את המצלמה באופן דינמי בהתאם להקשר, לזמן וכן הלאה. הופיעה לראשונה ב-Android 4.0. |
תכונות אחרות
בנוסף לתמיכה בכללי המדיניות שמפורטים בטבלה שלמעלה, בעזרת ממשק ה-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
. - יכולת להגיב ל
ACTION_DEVICE_ADMIN_ENABLED
Intent, מבוטאת במניפסט כמסנן 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
ממשקי API של DevicePolicyManager
לכתיבת אפליקציה לניהול מכשירים.
יצירת מחלקה משנית של DeviceAdminReceiver
כדי ליצור אפליקציית ניהול מכשירים, צריך לתת מחלקה משנית
DeviceAdminReceiver
הכיתה DeviceAdminReceiver
מורכב מסדרה של קריאות חוזרות (callback) שמופעלות כשאירועים מסוימים
יתרחשו.
במחלקה המשנית שלה DeviceAdminReceiver
, האפליקציה לדוגמה
פשוט מציגה התראת Toast
בתגובה
אירועים. לדוגמה:
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)) ... }
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. אפליקציה לדוגמה: הפעלת האפליקציה
הקוד הבא מופעל כשהמשתמש לוחץ על תיבת הסימון Enable Admin. הפעולה הזו תגרום להפעלה של פונקציית הקריאה החוזרת onPreferenceChange()
. הקריאה החוזרת (callback) הזו מופעלת כאשר המשתמש משנה את הערך של Preference
ועומד להיות מוגדר ו/או קבוע. אם המשתמש מפעיל את האפליקציה, המסך משתנה כדי להנחות אותו להפעיל את אפליקציית האדמין של המכשיר, כפי שמוצג באיור 2. אחרת, אפליקציית ניהול המכשיר מושבתת.
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 }
@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, שמנחה את המשתמשים
להוסיף את מנהל המכשיר למערכת (או לאפשר לו לדחות את הפעולה).
כשהאפליקציה צריכה לבצע פעולה המותנית
אפליקציית ניהול המכשיר מופעלת, היא מאשרת שהאפליקציה
פעיל. לשם כך, הוא משתמש ב-method DevicePolicyManager
isAdminActive()
. שימו לב שהשיטה DevicePolicyManager
isAdminActive()
מקבלת רכיב DeviceAdminReceiver
כארגומנטים שלה:
private lateinit var dpm: DevicePolicyManager ... private fun isActiveAdmin(): Boolean = dpm.isAdminActive(deviceAdminSample)
DevicePolicyManager dpm; ... private boolean isActiveAdmin() { return dpm.isAdminActive(deviceAdminSample); }
ניהול המדיניות
DevicePolicyManager
היא מחלקה ציבורית לניהול מדיניות
אכיפה במכשיר. DevicePolicyManager
מנהל מדיניות עבור אחד
או יותר של DeviceAdminReceiver
מופעים.
מקבלים כינוי ל-DevicePolicyManager
באופן הבא:
dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
DevicePolicyManager dpm = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
הקטע הזה מתאר איך להשתמש ב-DevicePolicyManager
כדי לבצע
משימות ניהוליות:
הגדרת כללי מדיניות לסיסמאות
DevicePolicyManager
כולל ממשקי API להגדרה ולאכיפה של מדיניות הסיסמאות במכשיר. ב-Device Administration API, הסיסמה חלה רק על
שיטה לביטול נעילה. בקטע הזה מתוארות משימות נפוצות שקשורות לסיסמה.
הגדרת סיסמה למכשיר
הקוד הזה מציג ממשק משתמש שמבקש מהמשתמש להגדיר סיסמה:
Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent -> startActivity(intent) }
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
- אין בדרישות המדיניות דרישות לגבי הסיסמה.
לדוגמה, כך מגדירים את מדיניות הסיסמאות כך שתחייב סיסמה אלפאנומרית:
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC)
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
הגדרת דרישות תוכן לסיסמה
החל מ-Android 3.0, המחלקה DevicePolicyManager
כוללת שיטות שמאפשרות לשפר את תוכן הסיסמה. עבור
לדוגמה, אפשר להגדיר מדיניות שלפיה סיסמאות חייבות להכיל לפחות
n אותיות רישיות. ריכזנו כאן את השיטות לשיפור התוכן של סיסמה:
setPasswordMinimumLetters()
setPasswordMinimumLowerCase()
setPasswordMinimumUpperCase()
setPasswordMinimumNonLetter()
setPasswordMinimumNumeric()
setPasswordMinimumSymbols()
לדוגמה, קטע הקוד הזה קובע שהסיסמה חייבת להכיל לפחות 2 אותיות גדולות:
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwMinUppercase = 2 ... dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase)
DevicePolicyManager dpm; ComponentName deviceAdminSample; int pwMinUppercase = 2; ... dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase);
הגדרת האורך המינימלי של הסיסמה
אפשר לציין שאורך הסיסמה חייב להיות לפחות באורך המינימלי שצוין. לדוגמה:
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwLength: Int = ... ... dpm.setPasswordMinimumLength(deviceAdminSample, pwLength)
DevicePolicyManager dpm; ComponentName deviceAdminSample; int pwLength; ... dpm.setPasswordMinimumLength(deviceAdminSample, pwLength);
הגדרת מספר מקסימלי של ניסיונות כושלים להזנת סיסמה
באפשרותך להגדיר את המספר המקסימלי המותר של ניסיונות כושלים להזנת סיסמה לפני נתוני המכשיר אופסו (כלומר, אופסו להגדרות המקוריות). לדוגמה:
val dPM:DevicePolicyManager private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val maxFailedPw: Int = ... ... dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw)
DevicePolicyManager dpm; ComponentName deviceAdminSample; int maxFailedPw; ... dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw);
הגדרת זמן קצוב לתפוגה של סיסמה
החל מגרסה 3.0 של Android, אפשר להשתמש ב-method setPasswordExpirationTimeout()
כדי להגדיר מתי תוקף הסיסמה יפוג. הזמן הזה מחושב כדלתא (הפרש) באלפיות שנייה מהרגע שבו האדמין של המכשיר מגדיר את הזמן הקצוב לתפוגה. לדוגמה:
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwExpiration: Long = ... ... dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration)
DevicePolicyManager dpm; ComponentName deviceAdminSample; long pwExpiration; ... dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration);
הגבלת הסיסמה על סמך היסטוריה
החל מגרסה 3.0 של Android, אפשר להשתמש בשיטה setPasswordHistoryLength()
כדי להגביל את היכולת של המשתמשים לעשות שימוש חוזר בסיסמאות ישנות. השיטה הזו לוקחת את הערך length
הפרמטר הזה, שמציין כמה פעמים
הסיסמאות נשמרות. כשהמדיניות הזו פעילה, משתמשים לא יכולים להזין
שתואמת ל-n הסיסמאות האחרונות. דבר זה מונע
שמשתמשים לא יוכלו להשתמש באותה סיסמה שוב ושוב. בדרך כלל משתמשים במדיניות הזו בשילוב עם המדיניות setPasswordExpirationTimeout()
, שמאלצת את המשתמשים לעדכן את הסיסמאות שלהם אחרי פרק זמן מסוים.
לדוגמה, קטע הקוד הזה אוסר על משתמשים לעשות שימוש חוזר באחת מ-5 הסיסמאות האחרונות שלהם:
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwHistoryLength = 5 ... dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength)
DevicePolicyManager dpm; ComponentName deviceAdminSample; int pwHistoryLength = 5; ... dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength);
הגדרת השיטה לביטול נעילת המכשיר
אתה יכול להגדיר את משך הזמן המקסימלי של חוסר פעילות של משתמשים שעלול להתרחש לפני המכשיר ננעל. לדוגמה:
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val timeMs: Long = 1000L * timeout.text.toString().toLong() ... dpm.setMaximumTimeToLock(deviceAdminSample, timeMs)
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... long timeMs = 1000L*Long.parseLong(timeout.getText().toString()); dpm.setMaximumTimeToLock(deviceAdminSample, timeMs);
אפשר גם להורות למכשיר לנעול באופן מיידי באופן פרוגרמטי:
private lateinit var dpm: DevicePolicyManager dpm.lockNow()
DevicePolicyManager dpm; dpm.lockNow();
איפוס הנתונים
אפשר להשתמש בשיטה DevicePolicyManager
wipeData()
כדי לאפס את המכשיר להגדרות המקוריות. זה מועיל
אם המכשיר אבד או נגנב. לרוב, ההחלטה למחוק את המכשיר מתקבלת אם מתקיימים תנאים מסוימים. לדוגמה, אפשר להשתמש ב-setMaximumFailedPasswordsForWipe()
כדי לציין שצריך למחוק מכשיר אחרי מספר ניסיונות כושלים ספציפיים להזנת סיסמה.
כדי לאפס את הנתונים:
private lateinit var dpm: DevicePolicyManager dpm.wipeData(0)
DevicePolicyManager dpm; dpm.wipeData(0);
השיטה wipeData()
מתייחסת
לבצע התממה של כמה אפשרויות. כרגע הערך חייב להיות 0.
השבתת המצלמה
החל מ-Android 4.0 אפשר להשבית את המצלמה. חשוב לדעת שההשבתה לא חייבת להיות סופית. ניתן להפעיל או להשבית את המצלמה באופן דינמי על סמך ההקשר, השעה וכן הלאה.
אתם קובעים אם המצלמה תהיה מושבתת באמצעות השיטה setCameraDisabled()
. לדוגמה, קטע הקוד הזה מגדיר את המצלמה כפעילה או כמושבתת על סמך הגדרת תיבת סימון:
private lateinit var disableCameraCheckbox: CheckBoxPreference private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked)
private CheckBoxPreference disableCameraCheckbox; DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked());
הצפנת האחסון
החל מ-Android 3.0, אפשר להשתמש
setStorageEncryption()
כדי להגדיר מדיניות שמחייבת הצפנה של אזור האחסון, במקומות שבהם האפשרות נתמכת.
לדוגמה:
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setStorageEncryption(deviceAdminSample, true)
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setStorageEncryption(deviceAdminSample, true);
דוגמה מלאה להפעלה של הצפנת אחסון זמינה בדוגמה של Device Administration API.
דוגמאות קוד נוספות
בדוגמאות Android AppRestrictionEnforcer ו-DeviceOwner מוסבר בהרחבה איך משתמשים בממשקי ה-API שמפורטים בדף הזה.