منسوخ شدن سیاستهای مدیریتی دستگاه . از اندروید ۹ (سطح API ۲۸)، برخی از سیاستهای مدیریتی هنگام فراخوانی توسط مدیر دستگاه، به عنوان منسوخ علامتگذاری میشوند. توصیه میکنیم از همین حالا برای این تغییر آماده شوید. برای کسب اطلاعات بیشتر و مشاهده گزینههای مهاجرت، بخش منسوخ شدن سیاستهای مدیریتی دستگاه را مطالعه کنید.
اندروید با ارائه API مدیریت دستگاه اندروید، از برنامههای سازمانی پشتیبانی میکند. API مدیریت دستگاه، ویژگیهای مدیریت دستگاه را در سطح سیستم ارائه میدهد. این APIها به شما امکان میدهند برنامههای امنیتی ایجاد کنید که در محیطهای سازمانی مفید هستند، جایی که متخصصان فناوری اطلاعات نیاز به کنترل کامل بر دستگاههای کارمندان دارند. به عنوان مثال، برنامه ایمیل اندروید داخلی از این APIها برای بهبود پشتیبانی Exchange استفاده کرده است. از طریق برنامه ایمیل، مدیران Exchange میتوانند سیاستهای رمز عبور - از جمله رمزهای عبور الفبایی یا پینهای عددی - را در بین دستگاهها اعمال کنند. مدیران همچنین میتوانند از راه دور گوشیهای گم شده یا دزدیده شده را پاک کنند (یعنی تنظیمات پیشفرض کارخانه را بازیابی کنند). کاربران Exchange میتوانند دادههای ایمیل و تقویم خود را همگامسازی کنند.
این سند برای توسعهدهندگانی در نظر گرفته شده است که میخواهند راهحلهای سازمانی برای دستگاههای مبتنی بر اندروید توسعه دهند. این سند، ویژگیهای مختلف ارائه شده توسط رابط برنامهنویسی کاربردی مدیریت دستگاه (Device Administration API) را برای تأمین امنیت قویتر دستگاههای کارمندان که توسط اندروید پشتیبانی میشوند، مورد بحث قرار میدهد.
نکته: برای کسب اطلاعات در مورد ساخت یک کنترلکننده سیاست کاری برای استقرارهای اندروید برای کار، به بخش «ساخت یک کنترلکننده سیاست دستگاه» مراجعه کنید.
حالت مالک دستگاه بدون سر
 اندروید ۱۴ (سطح API ۳۴) حالت کاربر سیستم بدون سر (Headless System User) را معرفی میکند (دستگاههایی که در آنها UserManager.isHeadlessSystemUserMode true را برمیگرداند). در حالت کاربر سیستم بدون سر، کاربر سیستم یک کاربر پسزمینه است و برای تعامل با کاربر نهایی به کاربران پیشزمینه اضافی متکی است. اندروید ۱۴ همچنین یک حالت وابسته به مالک دستگاه بدون سر را معرفی میکند که یک مالک پروفایل به همه کاربران وابسته به غیر از کاربر سیستمی که مالک دستگاه روی آن تنظیم شده است، اضافه میکند.
 در دستگاههایی که با یک کاربر سیستم بدون سر (headless system user) پیکربندی شدهاند (جایی که کاربر سیستم در پسزمینه اجرا میشود)، فقط سیاستهای دستگاه که دامنه سراسری دارند (سیاستهایی که برای همه کاربران قابل اجرا هستند) به کاربر یا کاربران پیشزمینه اعمال میشوند. برای جزئیات بیشتر به addUserRestriction مراجعه کنید.
تولیدکنندگان دستگاههای اندروید میتوانند به راهنماییهای منتشر شده در source.android.com مراجعه کنند.
مرور کلی API مدیریت دستگاه
در اینجا نمونههایی از انواع برنامههایی که ممکن است از رابط برنامهنویسی کاربردی مدیریت دستگاه (Device Administration API) استفاده کنند، آورده شده است:
- به مشتریان ایمیل بزنید.
- برنامههای امنیتی که از راه دور اطلاعات را پاک میکنند.
- سرویسها و برنامههای مدیریت دستگاه.
چگونه کار میکند؟
شما از رابط برنامهنویسی کاربردی مدیریت دستگاه (Device Administration API) برای نوشتن برنامههای مدیریت دستگاه که کاربران روی دستگاههای خود نصب میکنند، استفاده میکنید. برنامه مدیریت دستگاه، سیاستهای مورد نظر را اعمال میکند. نحوه کار آن به شرح زیر است:
- یک مدیر سیستم، یک برنامه مدیریت دستگاه مینویسد که سیاستهای امنیتی دستگاه از راه دور/محلی را اعمال میکند. این سیاستها میتوانند به صورت کدنویسیشده در برنامه قرار گیرند، یا برنامه میتواند به صورت پویا سیاستها را از یک سرور شخص ثالث دریافت کند.
-  این برنامه روی دستگاههای کاربران نصب میشود. اندروید در حال حاضر راهکاری برای تأمین خودکار ندارد. برخی از راههایی که یک مدیر سیستم میتواند برنامه را بین کاربران توزیع کند به شرح زیر است:- گوگل پلی.
- فعال کردن نصب از فروشگاه دیگر.
- توزیع برنامه از طریق روشهای دیگر، مانند ایمیل یا وبسایتها.
 
- سیستم از کاربر میخواهد که برنامه مدیریت دستگاه را فعال کند. چگونگی و زمان انجام این کار بستگی به نحوه پیادهسازی برنامه دارد.
- زمانی که کاربران برنامه مدیریت دستگاه را فعال میکنند، تابع سیاستهای آن میشوند. رعایت این سیاستها معمولاً مزایایی مانند دسترسی به سیستمها و دادههای حساس را به همراه دارد.
اگر کاربران برنامهی مدیریت دستگاه را فعال نکنند، این برنامه روی دستگاه باقی میماند، اما در حالت غیرفعال. کاربران مشمول سیاستهای آن نخواهند بود و برعکس، هیچ یک از مزایای برنامه را دریافت نخواهند کرد - برای مثال، ممکن است نتوانند دادهها را همگامسازی کنند.
اگر کاربری از رعایت این سیاستها خودداری کند (برای مثال، اگر کاربری رمز عبوری تنظیم کند که دستورالعملها را نقض کند)، این به برنامه بستگی دارد که چگونه با این موضوع برخورد کند. با این حال، معمولاً این امر منجر به عدم امکان همگامسازی دادهها توسط کاربر میشود.
اگر دستگاهی سعی کند به سروری متصل شود که به سیاستهایی نیاز دارد که در رابط برنامهنویسی مدیریت دستگاه پشتیبانی نمیشوند، اتصال مجاز نخواهد بود. رابط برنامهنویسی مدیریت دستگاه در حال حاضر اجازه تأمین جزئی را نمیدهد. به عبارت دیگر، اگر دستگاهی (به عنوان مثال، یک دستگاه قدیمی) از تمام سیاستهای ذکر شده پشتیبانی نکند، هیچ راهی برای اتصال دستگاه وجود ندارد.
اگر دستگاهی شامل چندین برنامهی مدیریتی فعال باشد، سختگیرانهترین سیاست اعمال میشود. هیچ راهی برای هدف قرار دادن یک برنامهی مدیریتی خاص وجود ندارد.
برای حذف نصب یک برنامهی مدیریت دستگاه موجود، کاربران ابتدا باید برنامه را از حالت مدیریت خارج کنند.
سیاستها
در یک محیط سازمانی، اغلب دستگاههای کارمندان باید از مجموعهای از سیاستهای سختگیرانه که نحوه استفاده از دستگاه را کنترل میکنند، پیروی کنند. رابط برنامهنویسی مدیریت دستگاه از سیاستهای ذکر شده در جدول 1 پشتیبانی میکند. توجه داشته باشید که رابط برنامهنویسی مدیریت دستگاه در حال حاضر فقط از رمزهای عبور برای قفل صفحه پشتیبانی میکند:
جدول ۱. سیاستهای پشتیبانیشده توسط رابط برنامهنویسی کاربردی مدیریت دستگاه.
| سیاست | توضیحات | 
|---|---|
| رمز عبور فعال شد | مستلزم آن است که دستگاهها درخواست پین یا رمز عبور کنند. | 
| حداقل طول رمز عبور | تعداد کاراکترهای مورد نیاز برای رمز عبور را تنظیم کنید. برای مثال، میتوانید پین یا رمزهای عبور را حداقل شش کاراکتر تعیین کنید. | 
| رمز عبور الفبایی-عددی الزامی است | مستلزم آن است که رمزهای عبور ترکیبی از حروف و اعداد باشند. آنها ممکن است شامل کاراکترهای نمادین باشند. | 
| رمز عبور پیچیده مورد نیاز است | الزام میکند که رمزهای عبور حداقل شامل یک حرف، یک رقم عددی و یک نماد خاص باشند. معرفی شده در اندروید ۳.۰. | 
| حداقل حروف مورد نیاز در رمز عبور | حداقل تعداد حروف مورد نیاز در رمز عبور برای همه مدیران یا یک مدیر خاص. معرفی شده در اندروید ۳.۰. | 
| حداقل حروف کوچک مورد نیاز در رمز عبور | حداقل تعداد حروف کوچک مورد نیاز در رمز عبور برای همه مدیران یا یک مدیر خاص. معرفی شده در اندروید ۳.۰. | 
| حداقل کاراکترهای غیرحرفی مورد نیاز در رمز عبور | حداقل تعداد کاراکترهای غیرحرفی مورد نیاز در رمز عبور برای همه مدیران یا یک مدیر خاص. معرفی شده در اندروید ۳.۰. | 
| حداقل ارقام عددی مورد نیاز در رمز عبور | حداقل تعداد ارقام عددی مورد نیاز در رمز عبور برای همه مدیران یا یک مدیر خاص. معرفی شده در اندروید ۳.۰. | 
| حداقل نمادهای مورد نیاز در رمز عبور | حداقل تعداد نمادهای مورد نیاز در رمز عبور برای همه مدیران یا یک مدیر خاص. معرفی شده در اندروید ۳.۰. | 
| حداقل حروف بزرگ مورد نیاز در رمز عبور | حداقل تعداد حروف بزرگ مورد نیاز در رمز عبور برای همه مدیران یا یک مدیر خاص. معرفی شده در اندروید ۳.۰. | 
| مهلت انقضای رمز عبور به پایان رسید | زمان انقضای رمز عبور، که به صورت یک دلتا بر حسب میلیثانیه از زمانی که مدیر دستگاه زمان انقضا را تعیین میکند، بیان میشود. معرفی شده در اندروید ۳.۰. | 
| محدودیت تاریخچه رمز عبور | این خطمشی مانع از استفاده مجدد کاربران از n رمز عبور منحصر به فرد آخر میشود. این خطمشی معمولاً همراه با setPasswordExpirationTimeout()استفاده میشود که کاربران را مجبور میکند پس از گذشت مدت زمان مشخصی، رمزهای عبور خود را بهروزرسانی کنند. این خطمشی در اندروید ۳.۰ معرفی شد. | 
| حداکثر تعداد دفعات تلاش ناموفق برای رمز عبور | مشخص میکند که کاربر چند بار میتواند رمز عبور اشتباه را وارد کند تا دستگاه اطلاعات خود را پاک کند. API مدیریت دستگاه همچنین به مدیران اجازه میدهد تا از راه دور دستگاه را به تنظیمات کارخانه بازنشانی کنند. این امر در صورت گم شدن یا سرقت دستگاه، دادهها را ایمن میکند. | 
| قفل حداکثر زمان عدم فعالیت | مدت زمان آخرین باری که کاربر صفحه را لمس کرده یا دکمهای را فشار داده است، قبل از اینکه دستگاه صفحه را قفل کند، تنظیم میکند. در این صورت، کاربران باید قبل از استفاده از دستگاه و دسترسی به دادهها، دوباره پین یا رمز عبور خود را وارد کنند. مقدار میتواند بین ۱ تا ۶۰ دقیقه باشد. | 
| نیاز به رمزگذاری فضای ذخیرهسازی | مشخص میکند که در صورت پشتیبانی دستگاه، فضای ذخیرهسازی باید رمزگذاری شود. در اندروید ۳.۰ معرفی شد. | 
| غیرفعال کردن دوربین | مشخص میکند که دوربین باید غیرفعال شود. توجه داشته باشید که این غیرفعالسازی لزوماً دائمی نیست. دوربین میتواند به صورت پویا بر اساس زمینه، زمان و غیره فعال/غیرفعال شود. در اندروید ۴.۰ معرفی شده است. | 
سایر ویژگیها
علاوه بر پشتیبانی از سیاستهای ذکر شده در جدول بالا، رابط برنامهنویسی کاربردی مدیریت دستگاه به شما امکان میدهد موارد زیر را انجام دهید:
- از کاربر بخواهید رمز عبور جدیدی تنظیم کند.
- فوراً دستگاه را قفل کنید.
- اطلاعات دستگاه را پاک کنید (یعنی دستگاه را به تنظیمات کارخانه برگردانید).
نمونه برنامه
 مثالهای استفاده شده در این صفحه بر اساس نمونه API مدیریت دستگاه هستند که در نمونههای SDK (که از طریق Android SDK Manager قابل دسترسی هستند) گنجانده شده و در سیستم شما با آدرس <sdk_root>/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java قرار دارد.
برنامه نمونه، نمایشی از ویژگیهای مدیریت دستگاه را ارائه میدهد. این برنامه به کاربران رابط کاربری ارائه میدهد که به آنها امکان میدهد برنامه مدیریت دستگاه را فعال کنند. پس از فعال کردن برنامه، میتوانند از دکمههای موجود در رابط کاربری برای انجام موارد زیر استفاده کنند:
- کیفیت رمز عبور را تنظیم کنید.
- الزاماتی را برای رمز عبور کاربر مشخص کنید، مانند حداقل طول، حداقل تعداد کاراکترهای عددی که باید داشته باشد و غیره.
- رمز عبور را تنظیم کنید. اگر رمز عبور با سیاستهای مشخص شده مطابقت نداشته باشد، سیستم خطا میدهد.
- تنظیم کنید که قبل از پاک شدن اطلاعات دستگاه (یعنی بازگرداندن آن به تنظیمات کارخانه)، چند بار میتوانید رمز عبور را اشتباه وارد کنید.
- تنظیم کنید که رمز عبور از چه زمانی منقضی شود.
- طول تاریخچه رمز عبور را تنظیم کنید ( طول به تعداد رمزهای عبور قدیمی ذخیره شده در تاریخچه اشاره دارد). این کار مانع از استفاده مجدد کاربران از یکی از n رمز عبور آخری که قبلاً استفاده کردهاند، میشود.
- اگر دستگاه از رمزگذاری پشتیبانی میکند، مشخص کنید که فضای ذخیرهسازی باید رمزگذاری شود.
- حداکثر زمان غیرفعال بودن دستگاه را که میتواند قبل از قفل شدن سپری شود، تنظیم کنید.
- دستگاه را فوراً قفل کنید.
- اطلاعات دستگاه را پاک کنید (یعنی تنظیمات کارخانه را بازیابی کنید).
- دوربین را غیرفعال کنید.

شکل ۱. تصویر برنامه نمونه
توسعه یک برنامه مدیریت دستگاه
مدیران سیستم میتوانند از رابط برنامهنویسی کاربردی مدیریت دستگاه (Device Administration API) برای نوشتن برنامهای استفاده کنند که اجرای سیاستهای امنیتی دستگاه از راه دور/محلی را اعمال میکند. این بخش مراحل ایجاد یک برنامه مدیریت دستگاه را خلاصه میکند.
ایجاد مانیفست
برای استفاده از رابط برنامهنویسی کاربردی مدیریت دستگاه، فایل مانیفست برنامه باید شامل موارد زیر باشد:
-  یک زیرکلاس از DeviceAdminReceiverکه شامل موارد زیر است:-  مجوز BIND_DEVICE_ADMIN.
-  قابلیت پاسخ به هدف ACTION_DEVICE_ADMIN_ENABLEDکه در مانیفست به عنوان یک فیلتر هدف بیان شده است.
 
-  مجوز 
- بیانیهای از سیاستهای امنیتی مورد استفاده در فراداده.
در اینجا گزیدهای از نمونهی مانیفست مدیریت دستگاه آمده است:
<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>
هنگام طراحی برنامه مدیریت دستگاه خود، لازم نیست همه سیاستها را لحاظ کنید، فقط مواردی را که برای برنامه شما مرتبط هستند، در نظر بگیرید.
برای بحث بیشتر در مورد فایل مانیفست، به راهنمای توسعهدهندگان اندروید مراجعه کنید.پیادهسازی کد
رابط برنامهنویسی کاربردی مدیریت دستگاه شامل کلاسهای زیر است:
-  DeviceAdminReceiver
-  کلاس پایه برای پیادهسازی یک کامپوننت مدیریت دستگاه. این کلاس امکان تفسیر اقدامات خام intent که توسط سیستم ارسال میشوند را فراهم میکند. برنامه مدیریت دستگاه شما باید شامل یک زیرکلاس DeviceAdminReceiverباشد.
-  DevicePolicyManager
-  کلاسی برای مدیریت سیاستهای اعمالشده بر روی یک دستگاه. اکثر کلاینتهای این کلاس باید یک DeviceAdminReceiverکه کاربر در حال حاضر فعال کرده است، منتشر کرده باشند.DevicePolicyManagerسیاستهای مربوط به یک یا چند نمونهDeviceAdminReceiverمدیریت میکند.
-  DeviceAdminInfo
- این کلاس برای مشخص کردن فراداده برای یک کامپوننت مدیر دستگاه استفاده میشود.
 این کلاسها پایه و اساس یک برنامه مدیریت دستگاه کاملاً کاربردی را فراهم میکنند. ادامه این بخش نحوه استفاده از APIهای DeviceAdminReceiver و DevicePolicyManager را برای نوشتن یک برنامه مدیریت دستگاه شرح میدهد.
زیرکلاسسازی 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 کلیک کند. این کار باعث فعال شدن تابع onPreferenceChange() میشود. این تابع زمانی فراخوانی میشود که مقدار Preference توسط کاربر تغییر کرده باشد و در شرف تنظیم و/یا حفظ باشد. اگر کاربر در حال فعال کردن برنامه باشد، صفحه نمایش تغییر میکند و از کاربر میخواهد که برنامه مدیریت دستگاه را فعال کند، همانطور که در شکل ۲ نشان داده شده است. در غیر این صورت، برنامه مدیریت دستگاه غیرفعال میشود. 
کاتلین
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 را فراخوانی میکند که کاربران را در اضافه کردن مدیر دستگاه به سیستم راهنمایی میکند (یا به آنها اجازه میدهد آن را رد کنند).
 وقتی برنامه نیاز به انجام عملیاتی دارد که منوط به فعال بودن برنامه مدیریت دستگاه است، تأیید میکند که برنامه فعال است. برای انجام این کار، از متد isAdminActive() از DevicePolicyManager استفاده میکند. توجه داشته باشید که متد isAdminActive() DevicePolicyManager یک کامپوننت 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هایی برای تنظیم و اجرای سیاست رمز عبور دستگاه است. در 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);
الزامات محتوای رمز عبور را تنظیم کنید
 از اندروید ۳.۰ به بعد، کلاس DevicePolicyManager شامل متدهایی است که به شما امکان میدهد محتوای رمز عبور را به طور دقیق تنظیم کنید. برای مثال، میتوانید سیاستی تنظیم کنید که بیان کند رمزهای عبور باید حداقل شامل n حرف بزرگ باشند. در اینجا متدهایی برای تنظیم دقیق محتوای رمز عبور آورده شده است:
-  setPasswordMinimumLetters()
-  setPasswordMinimumLowerCase()
-  setPasswordMinimumUpperCase()
-  setPasswordMinimumNonLetter()
-  setPasswordMinimumNumeric()
-  setPasswordMinimumSymbols()
برای مثال، این قطعه کد بیان میکند که رمز عبور باید حداقل دو حرف بزرگ داشته باشد:
کاتلین
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);
تنظیم مدت زمان انقضای رمز عبور
 از اندروید ۳.۰ به بعد، میتوانید از متد 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);
محدود کردن رمز عبور بر اساس سابقه
 از اندروید ۳.۰ به بعد، میتوانید از متد setPasswordHistoryLength() برای محدود کردن توانایی کاربران در استفاده مجدد از رمزهای عبور قدیمی استفاده کنید. این متد یک پارامتر طول میگیرد که مشخص میکند چند رمز عبور قدیمی ذخیره شده است. وقتی این سیاست فعال باشد، کاربران نمیتوانند رمز عبور جدیدی وارد کنند که با n رمز عبور آخر مطابقت داشته باشد. این امر مانع از استفاده مکرر کاربران از یک رمز عبور میشود. این سیاست معمولاً همراه با setPasswordExpirationTimeout() استفاده میشود که کاربران را مجبور میکند پس از گذشت مدت زمان مشخصی، رمزهای عبور خود را بهروزرسانی کنند.
برای مثال، این قطعه کد کاربران را از استفاده مجدد از ۵ رمز عبور آخرشان منع میکند:
کاتلین
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();
انجام عملیات پاکسازی دادهها
 شما میتوانید از متد wipeData() DevicePolicyManager برای تنظیم مجدد دستگاه به تنظیمات کارخانه استفاده کنید. این روش در صورت گم شدن یا دزدیده شدن دستگاه مفید است. اغلب تصمیم به پاک کردن اطلاعات دستگاه نتیجه برآورده شدن شرایط خاصی است. به عنوان مثال، میتوانید از setMaximumFailedPasswordsForWipe() برای تعیین اینکه یک دستگاه پس از تعداد مشخصی تلاش ناموفق برای وارد کردن رمز عبور باید پاک شود، استفاده کنید.
شما دادهها را به صورت زیر پاک میکنید:
کاتلین
private lateinit var dpm: DevicePolicyManager dpm.wipeData(0)
جاوا
DevicePolicyManager dpm; dpm.wipeData(0);
 متد wipeData() به عنوان پارامتر خود، یک ماسک بیتی از گزینههای اضافی دریافت میکند. در حال حاضر مقدار آن باید 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());
رمزگذاری ذخیرهسازی
 از اندروید ۳.۰ به بعد، میتوانید از متد setStorageEncryption() برای تنظیم سیاستی که رمزگذاری ناحیه ذخیرهسازی را الزامی میکند، در صورت پشتیبانی، استفاده کنید.
برای مثال:
کاتلین
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setStorageEncryption(deviceAdminSample, true)
جاوا
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setStorageEncryption(deviceAdminSample, true);
برای مشاهدهی مثال کاملی از نحوهی فعالسازی رمزگذاری حافظه، به نمونهی رابط برنامهنویسی کاربردی مدیریت دستگاه مراجعه کنید.
نمونههای کد اضافی
نمونههای Android AppRestrictionEnforcer و DeviceOwner کاربرد APIهای مطرحشده در این صفحه را بیشتر نشان میدهند.
