הוצאה משימוש של הרשאות אדמין במכשיר. החל מ-Android 9 (רמת API 28), חלק ממדיניות האדמין תסומן כהוצאה משימוש כשהיא תופעל על ידי אדמין במכשיר. מומלץ להתחיל להתכונן לשינוי הזה כבר עכשיו. מידע נוסף על אפשרויות ההעברה מופיע במאמר הוצאה משימוש של מנהל המכשיר.
ב-Android יש תמיכה באפליקציות לארגונים באמצעות Android Device Administration API. Device Administration API מספק תכונות לניהול מכשירים ברמת המערכת. ממשקי ה-API האלה מאפשרים לכם ליצור אפליקציות שמתמקדות באבטחה ושימושיות בסביבות ארגוניות, שבהן אנשי מקצוע בתחום ה-IT זקוקים לשליטה נרחבת במכשירי העובדים. לדוגמה, אפליקציית האימייל המובנית של Android משתמשת בממשקי ה-API האלה כדי לשפר את התמיכה ב-Exchange. דרך אפליקציית האימייל, אדמינים ב-Exchange יכולים לאכוף מדיניות סיסמאות – כולל סיסמאות אלפאנומריות או קודי אימות מספריים – בכל המכשירים. אדמינים יכולים גם למחוק מרחוק (כלומר, לשחזר את הגדרות ברירת המחדל) מכשירים שאבדו או נגנבו. משתמשי Exchange יכולים לסנכרן את נתוני האימייל והיומן שלהם.
המסמך הזה מיועד למפתחים שרוצים לפתח פתרונות לארגונים למכשירים עם Android. הוא דן בתכונות השונות שמספק Device Administration API כדי לספק אבטחה חזקה יותר למכשירים של עובדים שמופעלים על ידי Android.
הערה למידע על בניית Policy Controller עבור פריסות של Android for Work, ראו בניית בקר מדיניות מכשירים.
מצב ניהול ברמת בעלים ללא ממשק משתמש (GUI)
ב-Android 14 (רמת API 34) נוסף מצב משתמש ללא ממשק משתמש של מערכת (מכשירים שבהם UserManager.isHeadlessSystemUserMode מחזיר את הערך true). במצב משתמש ללא ממשק משתמש של מערכת, משתמש המערכת הוא משתמש ברקע והוא מסתמך על משתמשים נוספים בחזית לאינטראקציה עם משתמשי הקצה. ב-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.
האפליקציה לדוגמה מציעה הדגמה של תכונות ניהול המכשיר. הוא מציג למשתמשים ממשק משתמש שמאפשר להם להפעיל את אפליקציה לשותפים. אחרי שהם מפעילים את האפליקציה, הם יכולים להשתמש בלחצנים בממשק המשתמש כדי לבצע את הפעולות הבאות:
- הגדרת איכות הסיסמה.
- מציינים את הדרישות לסיסמה של המשתמש, כמו אורך מינימלי, מספר מינימלי של תווים מספריים שהיא חייבת להכיל וכו'.
- מגדירים את הסיסמה. אם הסיסמה לא תואמת למדיניות שצוינה, המערכת תחזיר שגיאה.
- כאן מגדירים כמה ניסיונות כושלים להזנת סיסמה יכולים להתרחש לפני שהמכשיר יאופס (כלומר, ישוחזר להגדרות המקוריות).
- מגדירים את משך הזמן שבו הסיסמה תהיה בתוקף.
- מגדירים את אורך היסטוריית הסיסמאות (אורך מתייחס למספר הסיסמאות הישנות שמאוחסנות בהיסטוריה). ההגדרה הזו מונעת מהמשתמשים להשתמש שוב באחת מ-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.הטמעת הקוד
ה-API לניהול מכשירים כולל את המחלקות הבאות:
DeviceAdminReceiver- מחלקה בסיסית להטמעה של רכיב לניהול מכשירים. הכיתה הזו מספקת דרך נוחה לפרש את פעולות ה-Intent הגולמיות שנשלחות על ידי המערכת. האפליקציה לניהול המכשיר חייבת לכלול מחלקת משנה של
DeviceAdminReceiver. DevicePolicyManager- מחלקה לניהול כללי מדיניות שנאכפים במכשיר. רוב הלקוחות של המחלקה הזו צריכים לפרסם
DeviceAdminReceiverשהמשתמש הפעיל כרגע. DevicePolicyManagerמנהל את כללי המדיניות של מכונה אחת או יותר שלDeviceAdminReceiver DeviceAdminInfo- המחלקה הזו משמשת לציון מטא-נתונים של רכיב מנהל מכשיר.
הכיתות האלה מספקות את הבסיס לאפליקציה לניהול מכשירים שפועלת באופן מלא.
שאר הקטע הזה מתאר איך משתמשים בממשקי ה-API של DeviceAdminReceiver ו-DevicePolicyManager כדי לכתוב אפליקציה לניהול מכשירים.
יצירת מחלקת משנה של DeviceAdminReceiver
כדי ליצור אפליקציה לשותפים, צריך ליצור מחלקת משנה של DeviceAdminReceiver. המחלקה DeviceAdminReceiver מורכבת מסדרה של קריאות חוזרות (callbacks) שמופעלות כשאירועים מסוימים מתרחשים.
במחלקה המשנית 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)); } ... }
הפעלת האפליקציה
אחד מהאירועים העיקריים שאפליקציה לשותפים צריכה לטפל בהם הוא הפעלת האפליקציה על ידי המשתמש. המשתמש חייב להפעיל את האפליקציה באופן מפורש כדי שהמדיניות תיאכף. אם המשתמש בוחר לא להפעיל את האפליקציה, היא עדיין תהיה במכשיר, אבל כללי המדיניות שלה לא ייאכפו והמשתמש לא יקבל את היתרונות של האפליקציה.
תהליך ההפעלה של האפליקציה מתחיל כשהמשתמש מבצע פעולה שמפעילה את ה-intent של ACTION_ADD_DEVICE_ADMIN. באפליקציה לדוגמה, זה קורה כשהמשתמש לוחץ על תיבת הסימון Enable Admin.
כשהמשתמש לוחץ על תיבת הסימון Enable Admin, התצוגה משתנה כדי לבקש מהמשתמש להפעיל את אפליקציה לשותפים, כמו שמוצג באיור 2.
איור 2. אפליקציה לדוגמה: הפעלת האפליקציה
הקוד הבא מופעל כשהמשתמש לוחץ על תיבת הסימון Enable Admin. הפעולה הזו מפעילה את פונקציית הקריאה החוזרת (callback) של 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, שמנחה את המשתמשים איך להוסיף את מנהל המכשיר למערכת (או מאפשרת להם לדחות אותו).
כשהאפליקציה צריכה לבצע פעולה שתלויה בהפעלת האפליקציה לניהול המכשיר, היא מוודאת שהאפליקציה פעילה. כדי לעשות את זה, משתמשים ב-method DevicePolicyManager isAdminActive(). שימו לב שה-method 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, אפשר להשתמש ב-method 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() כדי להגביל את היכולת של המשתמשים להשתמש שוב בסיסמאות ישנות. השיטה הזו מקבלת פרמטר 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);
ה-method wipeData() מקבל כפרמטר מיסוך סיביות של אפשרויות נוספות. כרגע הערך חייב להיות 0.
השבתת המצלמה
החל מ-Android 4.0, אפשר להשבית את המצלמה. חשוב לדעת: לא חייבים להשבית את החשבון באופן סופי. אפשר להפעיל או להשבית את המצלמה באופן דינמי על סמך ההקשר, הזמן וכו'.
אתם יכולים לקבוע אם המצלמה מושבתת באמצעות ה-method 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, אפשר להשתמש ב-method 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 שמופיעים בדף הזה.