نمای کلی مدیریت دستگاه

منسوخ شدن مدیریت دستگاه با شروع Android 9 (سطح API 28)، برخی از خط‌مشی‌های سرپرست در صورت فراخوانی توسط سرپرست دستگاه به‌عنوان منسوخ علامت‌گذاری می‌شوند. ما به شما توصیه می کنیم از هم اکنون برای این تغییر آماده شوید. برای کسب اطلاعات بیشتر و مشاهده گزینه‌های انتقال، حذف سرپرست دستگاه را بخوانید.

Android با ارائه API مدیریت دستگاه Android از برنامه‌های سازمانی پشتیبانی می‌کند. Device Administration API ویژگی های مدیریت دستگاه را در سطح سیستم فراهم می کند. این APIها به شما این امکان را می‌دهند که برنامه‌های آگاه از امنیت ایجاد کنید که در تنظیمات سازمانی مفید هستند، که در آن متخصصان فناوری اطلاعات نیاز به کنترل غنی بر دستگاه‌های کارمند دارند. برای مثال، برنامه داخلی Android Email از این APIها برای بهبود پشتیبانی Exchange استفاده کرده است. از طریق برنامه ایمیل، مدیران Exchange می‌توانند خط‌مشی‌های رمز عبور - از جمله رمزهای عبور الفبایی یا پین‌های عددی - را در دستگاه‌ها اعمال کنند. مدیران همچنین می توانند از راه دور گوشی های گم شده یا دزدیده شده را پاک کنند (یعنی پیش فرض های کارخانه را بازیابی کنند). کاربران Exchange می‌توانند ایمیل و داده‌های تقویم خود را همگام‌سازی کنند.

این سند برای توسعه دهندگانی است که می خواهند راه حل های سازمانی را برای دستگاه های مجهز به اندروید توسعه دهند. این ویژگی‌های مختلف ارائه شده توسط Device Administration API را مورد بحث قرار می‌دهد تا امنیت قوی‌تری را برای دستگاه‌های کارمندی که توسط Android ارائه می‌شوند، فراهم کند.

توجه برای اطلاعات در مورد ساخت کنترلر Work Policy برای استقرار Android for Work، به ساخت کنترلر سیاست دستگاه مراجعه کنید.

حالت مالک دستگاه بدون سر

Android 14 (سطح API 34) حالت کاربر سیستم Headless را معرفی می‌کند (دستگاه‌هایی که UserManager.isHeadlessSystemUserMode true برمی‌گرداند). در حالت کاربر سیستم بدون سر، کاربر سیستم یک کاربر پس زمینه است و برای تعامل با کاربر نهایی به کاربران پیش زمینه اضافی متکی است. اندروید 14 همچنین یک حالت وابسته به مالک دستگاه بدون هد را معرفی می‌کند که به همه کاربران وابسته به غیر از کاربر سیستمی که مالک دستگاه روی آن تنظیم شده است، یک مالک نمایه اضافه می‌کند.

در دستگاه‌هایی که با یک کاربر سیستم بدون هد پیکربندی شده‌اند (جایی که کاربر سیستم در پس‌زمینه اجرا می‌شود)، فقط خط‌مشی‌های دستگاهی که دامنه جهانی دارند (خط‌مشی‌هایی که برای همه کاربران قابل اجرا است) برای کاربر یا کاربران پیش‌زمینه اعمال می‌شوند. برای جزئیات به addUserRestriction مراجعه کنید.

سازندگان دستگاه‌های Android ممکن است به راهنمایی منتشر شده در source.android.com مراجعه کنند.

نمای کلی API مدیریت دستگاه

در اینجا نمونه هایی از انواع برنامه هایی که ممکن است از Device Administration API استفاده کنند آورده شده است:

  • مشتریان ایمیل
  • برنامه های امنیتی که از راه دور پاک می کنند.
  • خدمات و برنامه های مدیریت دستگاه

چگونه کار می کند؟

شما از Device Administration API برای نوشتن برنامه های سرپرست دستگاه که کاربران در دستگاه های خود نصب می کنند استفاده می کنید. برنامه مدیریت دستگاه خط‌مشی‌های مورد نظر را اعمال می‌کند. در اینجا نحوه کار آن آمده است:

  • یک مدیر سیستم یک برنامه مدیریت دستگاه می نویسد که سیاست های امنیتی دستگاه از راه دور/محلی را اعمال می کند. این خط‌مشی‌ها می‌توانند به صورت سخت در برنامه کدگذاری شوند، یا برنامه می‌تواند به‌صورت پویا خط‌مشی‌ها را از یک سرور شخص ثالث واکشی کند.
  • این برنامه بر روی دستگاه های کاربران نصب می شود. اندروید در حال حاضر راه حل تامین خودکار ندارد. برخی از روش هایی که یک sysadmin ممکن است برنامه را بین کاربران توزیع کند به شرح زیر است:
    • گوگل پلی.
    • فعال کردن نصب از فروشگاه دیگر.
    • توزیع برنامه از طریق روش های دیگر، مانند ایمیل یا وب سایت ها.
  • سیستم از کاربر می خواهد تا برنامه مدیریت دستگاه را فعال کند. اینکه چگونه و چه زمانی این اتفاق می افتد بستگی به نحوه پیاده سازی برنامه دارد.
  • وقتی کاربران برنامه سرپرست دستگاه را فعال کنند، مشمول خط‌مشی‌های آن می‌شوند. پیروی از این سیاست‌ها معمولاً مزایایی مانند دسترسی به سیستم‌ها و داده‌های حساس را به همراه دارد.

اگر کاربران برنامه مدیریت دستگاه را فعال نکنند، روی دستگاه باقی می‌ماند، اما در حالت غیرفعال است. کاربران مشمول خط‌مشی‌های آن نمی‌شوند، و برعکس هیچ‌یک از مزایای برنامه را دریافت نخواهند کرد - برای مثال، ممکن است نتوانند داده‌ها را همگام‌سازی کنند.

اگر کاربر از خط‌مشی‌ها پیروی نکند (به عنوان مثال، اگر کاربری رمز عبوری را تعیین کند که دستورالعمل‌ها را نقض می‌کند)، این به برنامه بستگی دارد که تصمیم بگیرد چگونه این موضوع را مدیریت کند. با این حال، معمولاً این باعث می‌شود که کاربر نتواند داده‌ها را همگام‌سازی کند.

اگر دستگاهی بخواهد به سروری متصل شود که نیاز به خط‌مشی‌هایی دارد که در Device Administration API پشتیبانی نمی‌شود، اتصال مجاز نخواهد بود. Device Administration API در حال حاضر اجازه تهیه جزئی را نمی دهد. به عبارت دیگر، اگر دستگاهی (مثلاً یک دستگاه قدیمی) از تمام خط مشی های اعلام شده پشتیبانی نکند، هیچ راهی برای اجازه دادن به دستگاه برای اتصال وجود ندارد.

اگر دستگاهی حاوی چندین برنامه مدیریت فعال باشد، سخت‌ترین خط‌مشی اعمال می‌شود. هیچ راهی برای هدف قرار دادن یک برنامه مدیریت خاص وجود ندارد.

برای حذف نصب یک برنامه مدیریت دستگاه موجود، کاربران باید ابتدا ثبت نام برنامه را به عنوان سرپرست لغو کنند.

سیاست ها

در یک محیط سازمانی، اغلب اتفاق می‌افتد که دستگاه‌های کارمند باید به مجموعه‌ای از سیاست‌های سختگیرانه که بر استفاده از دستگاه حاکم است، پایبند باشند. Device Administration API از خط مشی های فهرست شده در جدول 1 پشتیبانی می کند. توجه داشته باشید که Device Administration API در حال حاضر فقط از رمزهای عبور برای قفل صفحه پشتیبانی می کند:

جدول 1. سیاست های پشتیبانی شده توسط Device Administration API.

سیاست توضیحات
رمز عبور فعال شد نیاز دارد که دستگاه ها پین یا رمز عبور را بخواهند.
حداقل طول رمز عبور تعداد کاراکترهای لازم را برای رمز عبور تنظیم کنید. برای مثال، می‌توانید پین یا رمز عبور را بخواهید که حداقل شش کاراکتر داشته باشد.
رمز عبور الفبایی مورد نیاز است مستلزم آن است که رمز عبور ترکیبی از حروف و اعداد باشد. آنها ممکن است شامل شخصیت های نمادین باشند.
رمز عبور پیچیده مورد نیاز است مستلزم آن است که رمزهای عبور باید حداقل دارای یک حرف، یک رقم عددی و یک نماد خاص باشند. در اندروید 3.0 معرفی شد.
حداقل حروف مورد نیاز در رمز عبور حداقل تعداد حروف مورد نیاز در رمز عبور برای همه ادمین ها یا یک مورد خاص. در اندروید 3.0 معرفی شد.
حداقل حروف کوچک مورد نیاز در رمز عبور حداقل تعداد حروف کوچک مورد نیاز در رمز عبور برای همه ادمین ها یا یک مورد خاص. در اندروید 3.0 معرفی شد.
حداقل کاراکترهای غیرحرفی مورد نیاز در رمز عبور حداقل تعداد کاراکترهای غیرحرفی مورد نیاز در رمز عبور برای همه مدیران یا یک مورد خاص. در اندروید 3.0 معرفی شد.
حداقل ارقام عددی مورد نیاز در رمز عبور حداقل تعداد ارقام عددی مورد نیاز در رمز عبور برای همه ادمین ها یا یک مورد خاص. در اندروید 3.0 معرفی شد.
حداقل نمادهای مورد نیاز در رمز عبور حداقل تعداد نمادهای مورد نیاز در رمز عبور برای همه مدیران یا یک مورد خاص. در اندروید 3.0 معرفی شد.
حداقل حروف بزرگ مورد نیاز در رمز عبور حداقل تعداد حروف بزرگ مورد نیاز در رمز عبور برای همه ادمین ها یا یک مورد خاص. در اندروید 3.0 معرفی شد.
مهلت انقضای رمز عبور زمانی که گذرواژه منقضی می‌شود، به صورت دلتا در میلی‌ثانیه از زمانی که سرپرست دستگاه زمان انقضا را تعیین می‌کند، بیان می‌شود. در اندروید 3.0 معرفی شد.
محدودیت تاریخچه رمز عبور این خط مشی از استفاده مجدد کاربران از آخرین n رمز عبور منحصر به فرد جلوگیری می کند. این خط‌مشی معمولاً همراه با setPasswordExpirationTimeout() استفاده می‌شود که کاربران را مجبور می‌کند پس از گذشت مدت زمان مشخصی رمز عبور خود را به‌روزرسانی کنند. در اندروید 3.0 معرفی شد.
حداکثر تلاش برای رمز عبور ناموفق مشخص می‌کند که یک کاربر چند بار می‌تواند رمز عبور اشتباه را وارد کند قبل از اینکه دستگاه اطلاعات خود را پاک کند. Device Administration API همچنین به مدیران اجازه می دهد تا از راه دور دستگاه را به تنظیمات کارخانه بازنشانی کنند. در صورت گم شدن یا دزدیده شدن دستگاه، داده ها را ایمن می کند.
حداکثر زمان عدم فعالیت قفل مدت زمانی را از آخرین باری که کاربر صفحه را لمس کرده یا دکمه‌ای را فشار داده است، قبل از اینکه دستگاه صفحه نمایش را قفل کند، تعیین می‌کند. وقتی این اتفاق می‌افتد، کاربران باید قبل از استفاده از دستگاه‌های خود و دسترسی به داده‌ها، پین یا رمز عبور خود را دوباره وارد کنند. مقدار می تواند بین 1 تا 60 دقیقه باشد.
نیاز به رمزگذاری ذخیره سازی مشخص می کند که اگر دستگاه از آن پشتیبانی می کند، فضای ذخیره سازی باید رمزگذاری شود. در اندروید 3.0 معرفی شد.
دوربین را غیرفعال کنید مشخص می کند که دوربین باید غیرفعال باشد. توجه داشته باشید که این نباید یک غیرفعال کردن دائمی باشد. دوربین را می توان به صورت پویا بر اساس زمینه، زمان و غیره فعال/غیرفعال کرد. در اندروید 4.0 معرفی شد.

ویژگی های دیگر

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 که شامل موارد زیر است:
  • اعلامیه سیاست های امنیتی مورد استفاده در ابرداده.

در اینجا گزیده ای از مانیفست نمونه مدیریت دستگاه آمده است:

<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
کلاس پایه برای پیاده سازی یک جزء مدیریت دستگاه. این کلاس راحتی را برای تفسیر اعمال قصد خام ارسال شده توسط سیستم فراهم می کند. برنامه Device Administration شما باید دارای یک زیر کلاس DeviceAdminReceiver باشد.
DevicePolicyManager
کلاسی برای مدیریت خط‌مشی‌های اعمال‌شده در دستگاه. اکثر مشتریان این کلاس باید DeviceAdminReceiver منتشر کرده باشند که کاربر در حال حاضر آن را فعال کرده است. DevicePolicyManager خط‌مشی‌های یک یا چند نمونه DeviceAdminReceiver مدیریت می‌کند.
DeviceAdminInfo
این کلاس برای تعیین ابرداده برای یک جزء سرپرست دستگاه استفاده می شود.

این کلاس ها پایه و اساس یک برنامه مدیریت دستگاه کاملاً کاربردی را فراهم می کنند. بقیه این بخش نحوه استفاده از API های DeviceAdminReceiver و DevicePolicyManager را برای نوشتن یک برنامه مدیریت دستگاه توضیح می دهد.

Subclassing DeviceAdminReceiver

برای ایجاد یک برنامه مدیریت دستگاه، باید DeviceAdminReceiver را زیر کلاس قرار دهید. کلاس DeviceAdminReceiver شامل یک سری تماس‌های برگشتی است که هنگام رخ دادن رویدادهای خاص راه‌اندازی می‌شوند.

در زیر کلاس 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 کلیک کند.

هنگامی که کاربر بر روی گزینه Enable Admin کلیک می کند، صفحه نمایش تغییر می کند تا از کاربر بخواهد برنامه مدیریت دستگاه را فعال کند، همانطور که در شکل 2 نشان داده شده است.

شکل 2. نمونه برنامه: فعال کردن برنامه

در زیر کدی وجود دارد که با کلیک روی کادر فعال کردن مدیریت توسط کاربر اجرا می شود. این اثر باعث می‌شود که onPreferenceChange() پاسخ داده شود. این پاسخ تماس زمانی فراخوانی می شود که مقدار این 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 را فراخوانی می کند که کاربران را از طریق افزودن مدیر دستگاه به سیستم راهنمایی می کند (یا به آنها اجازه می دهد آن را رد کنند).

هنگامی که برنامه باید عملیاتی را انجام دهد که منوط به فعال بودن برنامه سرپرست دستگاه است، فعال بودن برنامه را تأیید می کند. برای انجام این کار از متد 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 حرف بزرگ داشته باشد. در اینجا روش هایی برای تنظیم دقیق محتویات رمز عبور وجود دارد:

به عنوان مثال، این قطعه بیان می کند که رمز عبور باید حداقل 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);
زمان انقضای رمز عبور را تنظیم کنید

با شروع Android 3.0، می‌توانید از متد 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، می‌توانید از روش setPasswordHistoryLength() برای محدود کردن توانایی کاربران برای استفاده مجدد از رمزهای عبور قدیمی استفاده کنید. این روش یک پارامتر طول می گیرد که مشخص می کند چند کلمه عبور قدیمی ذخیره شده است. وقتی این خط‌مشی فعال است، کاربران نمی‌توانند رمز عبور جدیدی را وارد کنند که با 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 باشد.

دوربین را غیرفعال کنید

با شروع اندروید 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);

برای مثال کاملی از نحوه فعال کردن رمزگذاری ذخیره سازی، نمونه API مدیریت دستگاه را ببینید.

نمونه کد اضافی

نمونه‌های Android AppRestrictionEnforcer و DeviceOwner استفاده از APIهای پوشش داده شده در این صفحه را بیشتر نشان می‌دهند.