デバイス管理の概要

デバイス管理のサポート終了。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 には現在、自動プロビジョニング ソリューションはありません。システム管理者がアプリをユーザーに配布する方法をいくつか次に示します。
    • 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 を使用するには、アプリのマニフェストに以下を含める必要があります。

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

これらのクラスは、完全に機能するデバイス管理アプリの基盤となります。このセクションの残りの部分では、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 の使用方法を詳しく説明しています。