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

منسوخ شدن مدیریت دستگاه با شروع 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 در سیستم شما قرار دارد. <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های پوشش داده شده در این صفحه را بیشتر نشان می‌دهند.

،

منسوخ شدن مدیریت دستگاه با شروع 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 در سیستم شما قرار دارد. <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 مراجعه کنید.

اجرای کد

API مدیریت دستگاه شامل کلاسهای زیر است:

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

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

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

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

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

با شروع Android 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 باشد.

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

با شروع Android 4.0 ، می توانید دوربین را غیرفعال کنید. توجه داشته باشید که این کار لازم نیست یک ناتوان کننده دائمی باشد. این دوربین می تواند بر اساس زمینه ، زمان و غیره به صورت پویا فعال و غیرفعال شود.

شما کنترل می کنید که آیا دوربین با استفاده از روش setCameraDisabled() غیرفعال است. به عنوان مثال ، این قطعه دوربین را بر اساس تنظیم کادر انتخاب فعال یا غیرفعال می کند:

کاتلین

private lateinit var disableCameraCheckbox: CheckBoxPreference
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked)

جاوا

private CheckBoxPreference disableCameraCheckbox;
DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked());

رمز ذخیره سازی

با شروع Android 3.0 ، می توانید از روش setStorageEncryption() استفاده کنید تا سیاستی را که نیاز به رمزگذاری منطقه ذخیره سازی ، جایی که پشتیبانی می شود ، تنظیم کنید.

به عنوان مثال:

کاتلین

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setStorageEncryption(deviceAdminSample, true)

جاوا

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setStorageEncryption(deviceAdminSample, true);

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

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

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

،

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

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

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

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

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

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

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

تولید کنندگان دستگاه Android ممکن است به راهنمایی های منتشر شده در Source.android.com مراجعه کنند.

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

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

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

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

شما از API مدیریت دستگاه برای نوشتن برنامه های مدیر دستگاه که کاربران در دستگاه های خود نصب می کنند استفاده می کنید. برنامه مدیر دستگاه سیاست های مورد نظر را اجرا می کند. در اینجا نحوه کار آن آمده است:

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

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

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

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

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

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

سیاست ها

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

جدول 1. سیاستهای پشتیبانی شده توسط 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 مدیریت دستگاه همچنین به مدیران اجازه می دهد تا از راه دور دستگاه را به صورت پیش فرض کارخانه تنظیم کنند. در صورت از بین رفتن یا سرقت دستگاه ، داده ها داده ها را تضمین می کند.
حداکثر قفل زمان عدم فعالیت مدت زمان را تنظیم می کند زیرا کاربر آخرین بار صفحه را لمس کرده یا قبل از اینکه دستگاه صفحه را قفل کند ، یک دکمه را فشار داده است. هنگامی که این اتفاق می افتد ، کاربران قبل از اینکه بتوانند از دستگاه های خود و دسترسی به داده های خود استفاده کنند ، باید دوباره پین ​​یا رمزهای عبور خود را وارد کنند. مقدار می تواند بین 1 تا 60 دقیقه باشد.
نیاز به رمزگذاری ذخیره سازی اگر دستگاه از آن پشتیبانی می کند ، منطقه ذخیره سازی باید رمزگذاری شود. معرفی شده در Android 3.0.
دوربین را غیرفعال کنید مشخص می کند که دوربین باید غیرفعال شود. توجه داشته باشید که این کار لازم نیست یک ناتوان کننده دائمی باشد. این دوربین می تواند بر اساس زمینه ، زمان و غیره به صورت پویا فعال و غیرفعال شود. معرفی شده در Android 4.0.

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

علاوه بر پشتیبانی از خط مشی های ذکر شده در جدول فوق ، API مدیریت دستگاه به شما امکان می دهد موارد زیر را انجام دهید:

  • کاربر را سریع تنظیم کنید تا رمز عبور جدید را تنظیم کند.
  • بلافاصله دستگاه را قفل کنید.
  • داده های دستگاه را پاک کنید (یعنی دستگاه را به پیش فرض های کارخانه خود بازگردانید).

نمونه برنامه

نمونه های مورد استفاده در این صفحه بر اساس نمونه API مدیریت دستگاه است که در نمونه های SDK (از طریق مدیر Android SDK موجود است) گنجانده شده و در سیستم شما به عنوان <sdk_root>/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java .

برنامه نمونه نمایشی از ویژگی های مدیر دستگاه را ارائه می دهد. این یک رابط کاربری را به کاربران ارائه می دهد که به آنها امکان می دهد برنامه مدیر دستگاه را فعال کنند. پس از فعال کردن برنامه ، می توانند از دکمه های موجود در رابط کاربری برای انجام موارد زیر استفاده کنند:

  • کیفیت رمز عبور را تنظیم کنید.
  • الزامات رمز عبور کاربر ، مانند حداقل طول ، حداقل تعداد کاراکترهای عددی که باید در آن داشته باشد و غیره را مشخص کنید.
  • رمز عبور را تنظیم کنید. اگر رمز عبور با خط مشی های مشخص مطابقت نداشته باشد ، سیستم خطایی را برمی گرداند.
  • قبل از پاک شدن دستگاه ، تعداد زیادی از تلاش های ناموفق رمز را تنظیم کنید (یعنی در تنظیمات کارخانه بازگردانده می شود).
  • تنظیم کنید تا چه مدت رمز عبور منقضی می شود.
  • طول تاریخ رمز عبور را تنظیم کنید ( طول به تعداد رمزهای قدیمی ذخیره شده در تاریخ اشاره دارد). این امر باعث می شود کاربران از یکی از آخرین رمزهای عبور N که قبلاً استفاده می کردند استفاده مجدد کنند.
  • اگر دستگاه از آن پشتیبانی می کند ، مشخص کنید که فضای ذخیره سازی باید رمزگذاری شود.
  • حداکثر زمان غیرفعال را که می تواند قبل از قفل دستگاه از بین برود ، تنظیم کنید.
  • بلافاصله قفل دستگاه را درست کنید.
  • داده های دستگاه را پاک کنید (یعنی تنظیمات کارخانه را بازیابی کنید).
  • دوربین را غیرفعال کنید.

شکل 1. تصویر برنامه نمونه

تهیه برنامه مدیریت دستگاه

مدیران سیستم می توانند از API مدیریت دستگاه برای نوشتن برنامه ای استفاده کنند که اجرای سیاست امنیتی از راه دور/محلی را اجرا کند. در این بخش مراحل مربوط به ایجاد یک برنامه مدیریت دستگاه خلاصه می شود.

ایجاد مانیفست

برای استفاده از 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 مراجعه کنید.

اجرای کد

API مدیریت دستگاه شامل کلاسهای زیر است:

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

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

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

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

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

با شروع Android 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 باشد.

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

با شروع Android 4.0 ، می توانید دوربین را غیرفعال کنید. توجه داشته باشید که این کار لازم نیست یک ناتوان کننده دائمی باشد. این دوربین می تواند بر اساس زمینه ، زمان و غیره به صورت پویا فعال و غیرفعال شود.

شما کنترل می کنید که آیا دوربین با استفاده از روش setCameraDisabled() غیرفعال است. به عنوان مثال ، این قطعه دوربین را بر اساس تنظیم کادر انتخاب فعال یا غیرفعال می کند:

کاتلین

private lateinit var disableCameraCheckbox: CheckBoxPreference
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked)

جاوا

private CheckBoxPreference disableCameraCheckbox;
DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked());

رمز ذخیره سازی

با شروع Android 3.0 ، می توانید از روش setStorageEncryption() استفاده کنید تا سیاستی را که نیاز به رمزگذاری منطقه ذخیره سازی ، جایی که پشتیبانی می شود ، تنظیم کنید.

به عنوان مثال:

کاتلین

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setStorageEncryption(deviceAdminSample, true)

جاوا

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setStorageEncryption(deviceAdminSample, true);

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

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

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