デバイス管理の概要

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

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

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

: 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 には現在、自動プロビジョニング ソリューションはありません。sysadmin は次のような方法でアプリをユーザーに配布します。
    • Google Play。
    • 別のストアからのインストールを有効化する。
    • メールやウェブサイトなどの方法でアプリを配布する。
  • システムはユーザーにデバイス管理アプリを有効にするよう求めます。これがいつ、どのように行われるかは、アプリの実装方法によって異なります。
  • ユーザーがデバイス管理アプリを有効にすると、ポリシーが適用されます。通常、これらのポリシーに準拠することで、機密性の高いシステムやデータへのアクセスなどのメリットが得られます。

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

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

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

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

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

ポリシー

企業環境では、従業員のデバイスが、デバイスの使用を管理する一連の厳格なポリシーを遵守しなければならないことがよくあります。Device Administration API は、表 1 に示すポリシーをサポートしています。現在、Device Administration API は画面ロックのパスワードのみをサポートしています。

表 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 サンプルに基づいています。この 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 を使用するには、アプリのマニフェストに以下を含める必要があります。

以下は、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
このクラスは、デバイス管理コンポーネントのメタデータを指定するために使用されます。

これらのクラスは、完全に機能するデバイス管理アプリの基盤を提供します。このセクションの残りの部分では、DeviceAdminReceiver API と DevicePolicyManager API を使用してデバイス管理アプリを作成する方法について説明します。

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 に示すユーザー インターフェースが呼び出されます。これにより、ユーザーにデバイス管理者を追加する(または拒否する)手順がユーザーに案内されます。

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

Kotlin

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

Java

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

ポリシーの管理

DevicePolicyManager は、デバイスに適用されるポリシーを管理するためのパブリック クラスです。DevicePolicyManager は、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();

データのワイプを行う

DevicePolicyManager メソッドの wipeData() を使用すると、デバイスを出荷時の設定にリセットできます。これは、デバイスの紛失や盗難があった場合に役立ちます。多くの場合、デバイスをワイプする判断は、特定の条件が満たされた場合の結果です。たとえば、setMaximumFailedPasswordsForWipe() を使用して、パスワードの入力に特定の回数失敗した後にデバイスをワイプするように指定できます。

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

Kotlin

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

Java

DevicePolicyManager dpm;
dpm.wipeData(0);

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

カメラを無効にする

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

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

Kotlin

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

Java

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

ストレージの暗号化

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

次に例を示します。

Kotlin

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

Java

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

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

他のサンプルコード

Android AppRestrictionEnforcerDeviceOwner のサンプルでは、このページで説明した API の使用方法について詳しく説明しています。