DeviceAdminSample.java 掘削

某ナニの準備名目にて ApiDemos のソース確認。
材料として以下も確認必要。

で、上記ドキュメントによればデバイス管理アプリは

  • DEVICE_ADMIN_ENABLED な broadcast intent を捕まえる receiver の定義
  • ACTION_ADD_DEVICE_ADMIN な intent を投げる実装
  • DevicePolicyManager なオブジェクトを取得してメソド呼び出し

で (スクリーンロック程度であれば) 何とかなる模様。

というあたりを踏まえつつ

サンプル確認していきます。まず該当する AndroidManifest な記述が以下。

        <!-- Device Admin Samples -->

        <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>

デバイス管理 API を使用するために、

  • DeviceAdminReceiver のサブクラスで
    • BIND_DEVICE_ADMIN が許可されていて
    • DEVICE_ADMIN_ENABLED を receive する

という broadcast receiver が定義されていないと、というのが前提とのこと。クラス定義は置いといて上記 Manifest は正にその通りな記述になってますね。
また、receiver の label や description はユーザが閲覧する許可ラベルとか許可の説明になるようです。あと、BIND_DEVICE_ADMIN だの DEVICE_ADMIN_ENABLED だのなあたりの解説については デバイス管理なドキュメント をご確認頂ければと (を。

DeviceAdminReceiver のサブクラス

基本的には Toast で何かを出力する、程度の実装のみな模様。
それは良いのですが、この broadcast receiver が捕まえるべき、DEVICE_ADMIN_ENABLED な broadcast intent はどこで発生するのかが気になるんですが、このアプリの場合は自分で intent を発行します。
# それが昨日エントリで引用した一連の処理だった模様

                        // 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, mDeviceAdminSample);
                        intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                                mActivity.getString(R.string.add_admin_extra_app_text));
                        startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN);

このサンプルでは戻りの処理な記述が省略されてますね。widget に実装する場合、この intent 発行の処理は onEnabled な callback でヤッてあげれば良いはず。
あと、記述についてもほぼこの通りで良いはずです。mDeviceAdminSample がアレですが定義などは onCreate のあたりで云々されてます。定義とか初期化など、以下です。

    // Interaction with the DevicePolicyManager
    DevicePolicyManager mDPM;
    ComponentName mDeviceAdminSample;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Prepare to work with the DPM
        mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
        mDeviceAdminSample = new ComponentName(this, DeviceAdminSampleReceiver.class);
    }

とりあえず

これで Screen off なナニは実装の目処が付いたんですが一応サンプル作って動作確認しないとマズいな。実装な報告は別途ってことで。
あとは加速度センサで云々な方面もアレ。