デバイス管理の概要

デバイス管理のサポート終了。Android 9(API レベル 28)以降、一部の管理ポリシーでは、デバイス管理者から呼び出された場合のサポートが終了となります。この変更への対応をすぐに開始されることをおすすめします。移行オプションについて詳しくは、 デバイス管理のサポート終了をご覧ください。

Android では、Device Administration API を提供することで、エンタープライズ アプリのサポートに対応しています。Device Administration API は、デバイス管理機能をシステムレベルで提供しており、同 API を使用することで、従業員のデバイスを詳細に制御する必要がある IT プロフェッショナルがエンタープライズ設定を行う際に役立つセキュリティ対応アプリを作成できます。たとえば、組み込みの Android メールアプリでは、この API を活用して Exchange のサポートを強化しています。管理者はメールアプリを使用して、パスワード ポリシー(英数字のパスワードや数字の PIN など)をデバイス全体に適用できます。紛失または盗難にあったデバイスをリモートワイプする(工場出荷時のデフォルト設定に戻す)こともできます。一方、Exchange のユーザーは、メールとカレンダーのデータの同期が行えます。

このドキュメントは、Android デバイス向けのエンタープライズ ソリューションを開発するデベロッパーを対象としています。Device Administration API が提供するさまざまな機能について説明します。これらの機能により、Android を搭載した従業員のデバイスに強力なセキュリティを実現できます。

: Android for Work のデプロイメントに使用する Work Policy Controller を構築する方法については、Device Policy Controller を構築するをご覧ください。

ヘッドレス デバイス所有者モード

Android 14(API レベル 34)では、ヘッドレス システム ユーザー モード(UserManager.isHeadlessSystemUserModetrue を返すデバイス)が導入されています。ヘッドレス システム ユーザー モードでは、システム ユーザーはバックグラウンド ユーザーであり、エンドユーザーの操作には追加のフォアグラウンド ユーザーが必要です。Android 14 では、ヘッドレス デバイス所有者提携モードも導入されています。このモードでは、デバイス所有者が設定されているシステム ユーザーを除くすべての提携ユーザーにプロファイル所有者が追加されます。

ヘッドレス システム ユーザーで構成されたデバイス(システム ユーザーがバックグラウンドで実行されるデバイス)では、スコープがグローバルなデバイス ポリシー(すべてのユーザーに適用されるポリシー)のみがフォアグラウンド ユーザーに適用されます。詳しくは、addUserRestriction をご覧ください。

Android デバイス メーカーは、source.android.com に公開されているガイダンスを参照できます。

Device Administrator API の概要

以下に Device Administration API を使用するアプリタイプの例を示します。

  • メール クライアント。
  • リモートワイプを行うセキュリティ アプリ。
  • デバイス管理サービスとアプリ。

仕組み

Device Administration API を使用して、ユーザーがデバイスにインストールするデバイス管理アプリを作成します。デバイス管理アプリが、必要なポリシーを適用します。仕組みは次のとおりです。

  • システム管理者は、リモート デバイスやローカル デバイスにセキュリティ ポリシーを適用するデバイス管理アプリを作成します。これらのポリシーは、アプリにハードコーディングすることも、アプリでサードパーティのサーバーからポリシーを動的に取得することもできます。
  • アプリはユーザーのデバイスにインストールされますが、Android には現在、自動プロビジョニング ソリューションがありません。システム管理者がアプリをユーザーに配布するには、次のいくつかの方法があります。
    • Google Play。
    • 別のストアからのインストールを有効化する。
    • メールやウェブサイトなどの方法でアプリを配布する。
  • システムからは、ユーザーにデバイス管理アプリを有効にするように求めるプロンプトが表示されます。タイミングと頻度については、アプリの実装方法によって異なります。
  • ユーザーがデバイス管理アプリを有効にすると、ポリシーが適用されます。通常は、これらのポリシーに準拠することで、機密性の高いシステムやデータへのアクセスなどのメリットが生じます。

ユーザーがデバイス管理アプリを有効にしていない場合、デバイス管理アプリはデバイスに存在するものの、非アクティブな状態になります。ユーザーはそのポリシーの対象にならず、逆にアプリによるメリットも得られません。たとえば、データの同期が行えなくなる場合があります。

ユーザーがポリシーに準拠できていない場合(たとえば、ユーザーがガイドラインに違反するパスワードを設定した場合)、対処方法はアプリによって決定されますが、通常はユーザーがデータを同期できなくなります。

デバイスが Device Administration API でサポートされていないポリシーを必要とするサーバーに接続しようとすると、接続は許可されません。現在、Device Administration API では部分的なプロビジョニングを許可していないため、デバイス(レガシー デバイスなど)が指定されたポリシーをすべてサポートしていない場合には、デバイスに接続を許可する方法がないということになります。

デバイスに複数の有効な管理アプリが含まれている場合、最も厳しいポリシーが適用されます。特定の管理アプリを対象にすることはできません。

既存のデバイス管理アプリをアンインストールするには、まずユーザーが管理者として、アプリの登録を解除する必要があります。

ポリシー

エンタープライズ環境では、通常、従業員のデバイスが、デバイスの使用を管理する厳格なポリシーに従う必要があります。Device Administration API は、表 1 に示すポリシーをサポートしています。なお、画面ロックに関しては、現在、パスワードのみがサポートされています。

表 1. Device Administration API でサポートされるポリシー。

ポリシー 説明
パスワードを有効にする デバイスで PIN やパスワードの要求を必須にします。
最小パスワード長 パスワードに必要な文字数を設定します。たとえば、PIN やパスワードの最小の長さを 6 文字にすることができます。
英数字のパスワードを必須にする 文字と数字を組み合わせたパスワードを必須にします。記号も含めることができます。
複雑なパスワードを必須にする 英字、数字、特殊記号を含めたパスワードを必須にします。Android 3.0 で導入されました。
パスワードに最低限必要な英文字の文字数 すべての管理者または特定の管理者のパスワードに最低限必要な文字数。Android 3.0 で導入されました。
パスワードに最低限必要な小文字の文字数 すべての管理者または特定の管理者のパスワードに最低限必要な小文字の文字数。Android 3.0 で導入されました。
パスワードに最低限必要な英文字以外の文字数 すべての管理者または特定の管理者のパスワードに最低限必要な英文字以外の文字数。Android 3.0 で導入されました。
パスワードに最低限必要な数字の文字数 すべての管理者または特定の管理者のパスワードに最低限必要な数字の文字数。Android 3.0 で導入されました。
パスワードに最低限必要な記号の文字数 すべての管理者または特定の管理者のパスワードに最低限必要な記号の文字数。Android 3.0 で導入されました。
パスワードに最低限必要な大文字の文字数 すべての管理者または特定の管理者のパスワードに最低限必要な大文字の文字数。Android 3.0 で導入されました。
パスワードの有効期限 パスワードが期限切れとなる時間。デバイス管理者が設定した有効期限からの差分(ミリ秒単位)として表されます。Android 3.0 で導入されました。
パスワード履歴の制限 このポリシーにより、n 回前までの固有パスワードが再利用できなくなります。通常、このポリシーは setPasswordExpirationTimeout() と組み合わせて使用され、指定された時間が経過するとユーザーにパスワードの更新を強制します。Android 3.0 で導入されました。
パスワード試行の上限回数 パスワード入力を試行できる上限回数を設定します。この回数を超えると、デバイスでデータがワイプされます。Device Administration API を使用すると、管理者はリモートでデバイスを工場出荷時のデフォルトにリセットできます。これにより、デバイスの紛失や盗難に備えてデータを保護できます。
非アクティブでロックされるまでの最大時間 ユーザーが画面に最後に触れたとき、またはボタンを押してからデバイスが画面をロックするまでの時間を設定します。この場合、デバイスを使用してデータにアクセスするには、PIN またはパスワードを再度入力する必要があります。1~60 分の値を指定できます。
ストレージの暗号化を必須にする デバイスでサポートされている場合、ストレージ領域の暗号化を必須に指定します。Android 3.0 で導入されました。
カメラを無効にする カメラを無効にすることを指定します。恒久的に無効化する必要はありません。カメラは、コンテキスト、時間などに基づいて動的に有効または無効にできます。Android 4.0 で導入されました。

その他の機能

Device Administration API では、上記の表に示すポリシーに対応しているほか、次のことも行えます。

  • ユーザーに新しいパスワードを設定するよう促す。
  • すぐにデバイスをロックする。
  • デバイスのデータをワイプする(デバイスを出荷時のデフォルトに戻す)

サンプルアプリ

このページで使用されているサンプルは Device Administration API のサンプルに基づいています。このサンプルは、SDK サンプル(Android SDK Manager から入手可能)に含まれており、システムの <sdk_root>/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java にあります。

サンプルアプリにデバイス管理機能のデモがあります。これは、デバイス管理アプリを有効にするユーザー インターフェースを提供します。アプリを有効にすると、ユーザーインターフェースのボタンを使用して次のことを行えます。

  • パスワードのレベルを設定する。
  • 最小の文字数、パスワードに最低限含める必要がある数字の数など、ユーザー パスワードの要件を指定する。
  • パスワードを設定する。パスワードが指定されたポリシーに準拠していない場合は、エラーが返されます。
  • パスワード入力を試行できる上限回数を設定する。この回数を超えると、デバイスがワイプされます(工場出荷時の設定に復元される)。
  • パスワードの有効期限を設定する。
  • パスワードの履歴の数を設定する(ここでいう数は、履歴に保存されるパスワードの世代数を意味します)。これにより、n 回前までの使用済みパスワードが再利用できなくなります。
  • デバイスでサポートされている場合に、ストレージ領域の暗号化を指定する。
  • 非アクティブな状態が続く場合に、デバイスがロックされるまでの時間の最大値を設定する。
  • すぐにデバイスをロックする。
  • デバイスのデータをワイプする(出荷時の設定に戻す)。
  • カメラを無効にする。

図 1. サンプルアプリのスクリーンショット

デバイス管理アプリの開発

システム管理者は Device Administration API を使用して、リモート デバイスやローカル デバイスにセキュリティ ポリシーを適用するアプリを作成できます。このセクションでは、デバイス管理アプリの作成手順についてまとめます。

マニフェストの作成

Device Administration API を使用するには、アプリのマニフェストに次の情報を含める必要があります。

  • DeviceAdminReceiver のサブクラス。以下の情報が含まれます。
  • メタデータで使用されるセキュリティ ポリシーの宣言。

以下は、Device Administration サンプル マニフェストからの抜粋です。

<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
デバイス管理コンポーネントを実装するための基本クラス。このクラスは、システムによって送信される未処理のインテント アクションを解釈するための便利な機能を提供します。デバイス管理アプリには、DeviceAdminReceiver サブクラスが含まれている必要があります。
DevicePolicyManager
デバイスに適用されるポリシーを管理するクラス。このクラスのほとんどのクライアントは、ユーザーが現在有効にしている DeviceAdminReceiver を公開している必要があります。DevicePolicyManager は、1 つまたは複数の DeviceAdminReceiver インスタンスのポリシーを管理します。
DeviceAdminInfo
このクラスは、デバイス管理者コンポーネントのメタデータを指定するために使用されます。

これらのクラスは、完全に機能するデバイス管理アプリの基礎を提供します。このセクションの後半では、デバイス管理アプリを作成するための API である DeviceAdminReceiverDevicePolicyManager の使用方法について説明します。

DeviceAdminReceiver のサブクラス化

デバイス管理アプリを作成するには、DeviceAdminReceiver をサブクラス化する必要があります。DeviceAdminReceiver クラスは、特定のイベントが発生したときにトリガーされる一連のコールバックで構成されます。

DeviceAdminReceiver サブクラスのサンプルアプリは、特定のイベントへの応答として Toast 通知を表示するだけです。例:

Kotlin

class DeviceAdminSample : DeviceAdminReceiver() {

    private fun showToast(context: Context, msg: String) {
        context.getString(R.string.admin_receiver_status, msg).let { status ->
            Toast.makeText(context, status, Toast.LENGTH_SHORT).show()
        }
    }

    override fun onEnabled(context: Context, intent: Intent) =
            showToast(context, context.getString(R.string.admin_receiver_status_enabled))

    override fun onDisableRequested(context: Context, intent: Intent): CharSequence =
            context.getString(R.string.admin_receiver_status_disable_warning)

    override fun onDisabled(context: Context, intent: Intent) =
            showToast(context, context.getString(R.string.admin_receiver_status_disabled))

    override fun onPasswordChanged(context: Context, intent: Intent, userHandle: UserHandle) =
            showToast(context, context.getString(R.string.admin_receiver_status_pw_changed))
...
}

Java

public class DeviceAdminSample extends DeviceAdminReceiver {

    void showToast(Context context, String msg) {
        String status = context.getString(R.string.admin_receiver_status, msg);
        Toast.makeText(context, status, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onEnabled(Context context, Intent intent) {
        showToast(context, context.getString(R.string.admin_receiver_status_enabled));
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return context.getString(R.string.admin_receiver_status_disable_warning);
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        showToast(context, context.getString(R.string.admin_receiver_status_disabled));
    }

    @Override
    public void onPasswordChanged(Context context, Intent intent, UserHandle userHandle) {
        showToast(context, context.getString(R.string.admin_receiver_status_pw_changed));
    }
...
}

アプリの有効化

デバイス管理アプリが処理しなければならない主要イベントの 1 つに、ユーザーによるアプリの有効化があります。ポリシーを適用するには、ユーザーがアプリを明示的に有効にする必要があります。ユーザーがアプリを有効にしない選択をした場合、アプリはデバイスに引き続き存在しますが、そのポリシーは適用されず、ユーザーはアプリのメリットを享受できません。

ユーザーが ACTION_ADD_DEVICE_ADMIN インテントをトリガーするアクションを実行すると、アプリを有効にするプロセスが開始されます。サンプルアプリでは、ユーザーが [Enable Admin] チェックボックスをオンにすると、このプロセスが発生します。

ユーザーが [Enable Admin] チェックボックスをオンにすると、図 2 に示すように、デバイス管理アプリをアクティブにするようユーザーに求める表示に変わります。

図 2. サンプルアプリ: アプリの有効化

ユーザーが [Enable Admin] チェックボックスをオンにしたときに実行されるコードを以下に示します。これには、onPreferenceChange() コールバックをトリガーする効果があります。このコールバックは、Preference の値がユーザーによって変更され、設定または永続化(あるいはその両方)されるときに呼び出されます。ユーザーがアプリを有効にしようとする場合、図 2 に示すように、デバイス管理アプリをアクティブにするようユーザーに求める表示に変わります。それ以外の場合は、デバイス管理アプリは無効になります。

Kotlin

override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
    if (super.onPreferenceChange(preference, newValue)) return true
    val value = newValue as Boolean
    if (preference == enableCheckbox) {
        if (value != adminActive) {
            if (value) {
                // Launch the activity to have the user enable our admin.
                val intent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN).apply {
                    putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample)
                    putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                            activity.getString(R.string.add_admin_extra_app_text))
                }
                startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN)
                // return false - don't update checkbox until we're really active
                return false
            } else {
                dpm.removeActiveAdmin(deviceAdminSample)
                enableDeviceCapabilitiesArea(false)
                adminActive = false
            }
        }
    } else if (preference == disableCameraCheckbox) {
        dpm.setCameraDisabled(deviceAdminSample, value)
    }
    return true
}

Java

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
    if (super.onPreferenceChange(preference, newValue)) {
        return true;
    }
    boolean value = (Boolean) newValue;
    if (preference == enableCheckbox) {
        if (value != adminActive) {
            if (value) {
                // Launch the activity to have the user enable our admin.
                Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample);
                intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                        activity.getString(R.string.add_admin_extra_app_text));
                startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN);
                // return false - don't update checkbox until we're really active
                return false;
            } else {
                dpm.removeActiveAdmin(deviceAdminSample);
                enableDeviceCapabilitiesArea(false);
                adminActive = false;
            }
        }
    } else if (preference == disableCameraCheckbox) {
        dpm.setCameraDisabled(deviceAdminSample, value);
    }
    return true;
}

intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample) 行は、mDeviceAdminSampleDeviceAdminReceiver コンポーネント)がターゲット ポリシーであることを示しています。この行は、図 2 に示すユーザー インターフェースを呼び出します。これは、デバイス管理者をシステムに追加するようユーザーを誘導します(またはこれをユーザーが拒否できるようにします)。

アプリで、デバイス管理アプリが有効になっていることを条件とする処理を行う必要がある場合、アプリがアクティブであることを確認します。これを行うには、DevicePolicyManagerisAdminActive() メソッドを使用します。なお、DevicePolicyManagerisAdminActive() メソッドは DeviceAdminReceiver コンポーネントを引数として取ります。

Kotlin

private lateinit var dpm: DevicePolicyManager
...
private fun isActiveAdmin(): Boolean = dpm.isAdminActive(deviceAdminSample)

Java

DevicePolicyManager dpm;
...
private boolean isActiveAdmin() {
    return dpm.isAdminActive(deviceAdminSample);
}

ポリシーの管理

DevicePolicyManager は、デバイスに適用されているポリシーを管理するためのパブリック クラスです。DevicePolicyManager は、1 つまたは複数の DeviceAdminReceiver インスタンスのポリシーを管理します。

DevicePolicyManager を扱う方法を以下に示します。

Kotlin

dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager

Java

DevicePolicyManager dpm =
    (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);

このセクションでは、DevicePolicyManager を使用して管理タスクを行う方法について説明します。

パスワード ポリシーを設定する

DevicePolicyManager には、デバイスのパスワード ポリシーを設定および適用するための API が含まれています。Device Administration API では、パスワードは画面ロックにのみ適用されます。このセクションでは、パスワード関連の一般的なタスクについて説明します。

デバイスのパスワードを設定する

このコードは、パスワードを設定するようユーザーに促すユーザー インターフェースを表示します。

Kotlin

Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent ->
    startActivity(intent)
}

Java

Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
startActivity(intent);
パスワードのレベルを設定する

パスワードのレベルは、次の DevicePolicyManager 定数のいずれかになります。

PASSWORD_QUALITY_ALPHABETIC
少なくともアルファベット(または他の記号)を含むパスワードを入力する必要があります。
PASSWORD_QUALITY_ALPHANUMERIC
少なくとも数字とアルファベット(またはその他の記号)の両方を含むパスワードを入力する必要があります。
PASSWORD_QUALITY_NUMERIC
少なくとも数字を含むパスワードを入力する必要があります。
PASSWORD_QUALITY_COMPLEX
少なくとも文字、数字、特殊記号を含むパスワードを入力する必要があります。
PASSWORD_QUALITY_SOMETHING
ポリシーではなんらかのパスワードが必要ですが、その種類については問題にしません。
PASSWORD_QUALITY_UNSPECIFIED
ポリシーにパスワードの要件はありません。

英数字のパスワードを要求するパスワード ポリシーを設定する方法は次のとおりです。

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC)

Java

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
パスワード コンテンツ要件を設定する

Android 3.0 以降、DevicePolicyManager クラスには、パスワードの内容を微調整できるメソッドが含まれています。たとえば、パスワードに少なくとも n 個の大文字を含める必要があることを示すポリシーを設定できます。以下に、パスワードの内容を微調整する方法を示します。

次のスニペットの例では、パスワードに少なくとも 2 つの大文字が必要であることを示しています。

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwMinUppercase = 2
...
dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase)

Java

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwMinUppercase = 2;
...
dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase);
最小パスワード長を設定する

パスワードを、指定した最小文字数以上にする必要があることを指定できます。例:

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwLength: Int = ...
...
dpm.setPasswordMinimumLength(deviceAdminSample, pwLength)

Java

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwLength;
...
dpm.setPasswordMinimumLength(deviceAdminSample, pwLength);
パスワード試行の上限回数を設定する

パスワード入力を試行できる回数の上限を設定できます。この回数を超えると、デバイスがワイプされます(工場出荷時設定にリセットされます)。例:

Kotlin

val dPM:DevicePolicyManager
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val maxFailedPw: Int = ...
...
dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw)

Java

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int maxFailedPw;
 ...
dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw);
パスワードの有効期限を設定する

Android 3.0 以降では、setPasswordExpirationTimeout() メソッドを使用してパスワードの有効期限を設定できます。これは、デバイス管理者が設定した有効期限からの差分(ミリ秒単位)で表されます。例:

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwExpiration: Long = ...
...
dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration)

Java

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
long pwExpiration;
...
dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration);
履歴に基づいてパスワードを制限する

Android 3.0 以降では、setPasswordHistoryLength() メソッドを使用して以前のパスワード再利用を制限できます。このメソッドは length パラメータを取ります。ここでパスワードの保存世代数を指定します。このポリシーを有効にすると、n 回前までのものに一致するパスワードは、新しいパスワードとして入力することができません。これにより、ユーザーは同じパスワードを何度も使用できなくなります。通常、このポリシーは setPasswordExpirationTimeout() と組み合わせて使用され、指定された時間が経過するとユーザーにパスワードの更新を強制します。

次のスニペットの例では、5 回前までのパスワードを再利用できません。

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwHistoryLength = 5
...
dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength)

Java

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwHistoryLength = 5;
...
dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength);

デバイスロックを設定する

ユーザーが非アクティブな状態でいる時間の上限を設定できます。この上限値を超えると、デバイスがロックされます。例:

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val timeMs: Long = 1000L * timeout.text.toString().toLong()
...
dpm.setMaximumTimeToLock(deviceAdminSample, timeMs)

Java

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
long timeMs = 1000L*Long.parseLong(timeout.getText().toString());
dpm.setMaximumTimeToLock(deviceAdminSample, timeMs);

また、次のように、プログラムでデバイスに直ちにロックするよう指示することもできます。

Kotlin

private lateinit var dpm: DevicePolicyManager
dpm.lockNow()

Java

DevicePolicyManager dpm;
dpm.lockNow();

データのワイプを行う

DevicePolicyManagerwipeData() メソッドを使用して、デバイスを出荷時の設定にリセットできます。これは、デバイスの紛失や盗難の際に便利です。多くの場合、特定の条件が満たされた場合にデバイスをワイプする判断を下します。setMaximumFailedPasswordsForWipe() を使用して、パスワード試行が特定の回数失敗した後にデバイスをワイプするように指定できます。

以下に、データをワイプする例を示します。

Kotlin

private lateinit var dpm: DevicePolicyManager
dpm.wipeData(0)

Java

DevicePolicyManager dpm;
dpm.wipeData(0);

wipeData() メソッドは、追加オプションのビットマスクをパラメータとして取ります。現在、値は 0 に設定する必要があります。

カメラを無効にする

Android 4.0 以降では、カメラを無効にできます。恒久的に無効化する必要はありません。カメラは、コンテキスト、時間などに基づいて動的に有効または無効にできます。

setCameraDisabled() メソッドを使用して、カメラを無効にするかどうかを制御します。次のスニペットの例では、チェックボックスの設定に基づいてカメラを有効または無効に設定します。

Kotlin

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

Java

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

ストレージの暗号化

Android 3.0 以降では、setStorageEncryption() メソッドを使用して、サポートされている場合に、ストレージ領域の暗号化を必須とするポリシーを設定できます。

例:

Kotlin

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

Java

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

ストレージ暗号化を有効にする完全な例については、Device Administration API サンプルをご覧ください。

その他のコードサンプル

Android AppRestrictionEnforcer サンプルと DeviceOwner サンプルでは、このページで扱っている API の使用方法をさらに詳しく説明しています。