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

הוצאה משימוש של מנהל המכשיר. החל מ-Android 9 (רמת API 28), חלק מכללי המדיניות של האדמין יסומנו כהוצאה משימוש כאשר הופעל על ידי אדמין המכשיר. מומלץ להתחיל להתכונן לקראת השינוי הזה כבר עכשיו. למידה מידע נוסף על אפשרויות ההעברה, הוצאה משימוש של מנהל המכשיר.

מערכת Android כוללת תמיכה באפליקציות עסקיות, כי היא כוללת ממשק API לניהול מכשירי Android. 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 Manage 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.

מדיניות תיאור
הסיסמה הופעלה נדרשת בקשה להצגת קוד אימות או סיסמה במכשירים.
אורך סיסמה מינימלי מגדירים את מספר התווים הנדרש לסיסמה. לדוגמה, יכול לדרוש שה-PIN או הסיסמאות יכללו שישה תווים לפחות.
יש צורך בסיסמה אלפאנומרית כדי שלסיסמאות יש צורך שילוב של אותיות ומספרים. הן יכולות לכלול תווים סימבוליים.
נדרשת סיסמה מורכבת הסיסמאות חייבות להכיל לפחות אות, ספרה וסמל מיוחד. התכונה הושקה ב-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, חייב לכלול את הפרטים הבאים:

הנה קטע מתוך המניפסט לדוגמה של ניהול המכשיר:

<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
סיווג הבסיס להטמעת רכיב ניהול מכשירים. הכיתה הזו מספקת נוחיות לפירוש של פעולות ה-Intent הגולמיות שנשלחות על ידי המערכת. האפליקציה לניהול המכשיר חייבת לכלול מחלקה משנית אחת (DeviceAdminReceiver).
DevicePolicyManager
סיווג לניהול כללי מדיניות שנאכפים על מכשיר. רוב הלקוחות של הקורס הזה חייב לפרסם DeviceAdminReceiver שהמשתמש פעיל כרגע. DevicePolicyManager מנהלת את המדיניות עבור אירוע DeviceAdminReceiver אחד או יותר
DeviceAdminInfo
המחלקה הזו משמשת לציון מטא-נתונים לרכיב של מנהל המכשיר.

השיעורים האלה מספקים את הבסיס לאפליקציה לניהול מכשירים שפועלת באופן מלא. שאר הסעיף הזה מתאר את אופן השימוש שלך בDeviceAdminReceiver ממשקי API של 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 בכוונה טובה. ב אפליקציה לדוגמה, הדבר קורה כשהמשתמש לוחץ על הלחצן הפעלה תיבת סימון של אדמין.

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

איור 2. אפליקציה לדוגמה: הפעלת האפליקציה

בהמשך מופיע הקוד שמופעל כשהמשתמש לוחץ על תיבת הסימון הפעלת אדמין. היא משפיעה על הפעלת onPreferenceChange() קריאה חוזרת. הקריאה החוזרת (callback) הזו מופעלת כאשר המשתמש משנה את הערך של 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 אותיות רישיות. אלה השיטות לכוונון עדין של סיסמה תוכן:

לדוגמה, קטע הקוד הזה מציין שהסיסמה צריכה לכלול לפחות 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() שיטה להגבלת מספר המשתמשים יכולת להשתמש שוב בסיסמאות ישנות. השיטה הזו לוקחת את הערך 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 ובעלי המכשיר דוגמאות נוספות ממחישות את השימוש בממשקי ה-API שמפורטים בדף הזה.