2011年11月4日金曜日

[Android] アプリから画面ロックをかける

概要

アプリケーションからデバイスをロック状態(スリープ)にする.
結構てこずったので手順をメモ.


手順

  1. android.app.admin.DeviceAdminReceiver をインポート
  2. DeviceAdminReceiver を継承したクラスを作成
  3. デバイス管理者権限の付与
  4. Manifest ファイルの定義
  5. デバイス管理ポリシー定義ファイルの追加


1.android.app.admin.DeviceAdminReceiver をインポート

DeviceAdminReceiver.lockNow() を実行したいActivity内に定義すればEclipseの補完機能でPackageのインポートまでやってくれる.

2.DeviceAdminReceiver を継承したクラスを作成

onEnabled と onDisabled をOverrideする. 特に処理がなければ中身は空でも良い.(なぜこれが必要なのかは不明)
public class MyDeviceReceiver extends DeviceAdminReceiver {

    @Override
    public void onEnabled(Context context, Intent intent) {
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
    }
}


3.デバイス管理者権限の付与

Activityを継承したクラス(画面ロックを実行したいアクティビティ)のメンバ変数に以下を定義
 static final int RESULT_ENABLE = 1;
 ComponentName mCN;
 DevicePolicyManager mDPM;
onCreate 内でデバイス管理者の登録を行う.
mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
mCN = new ComponentName(this, MyDeviceReceiver.class);

if (!mDPM.isAdminActive(mCN)) {
    // デバイス管理者の登録
    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);  
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mCN);
    startActivityForResult(intent, RESULT_ENABLE);
}
else {
    // 権限が取れていればロック実行
    devicePolicyManager_.lockNow();
}
デバイス管理者登録したActivityの戻りを受け取る.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case RESULT_ENABLE:
            if (resultCode == Activity.RESULT_OK) {
                // Has become the device administrator.
                Log.i("tag", "Administration enabled!");
            }
            else {
                //Canceled or failed.
                Log.i("tag", "Administration enable FAILED!");
            }
            return;
    }
    super.onActivityResult(requestCode, resultCode, data);
}


4.Manifest ファイルの定義

Manifestにレシーバを定義する.
<receiver android:name=".MyDeviceReceiver"
    android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data android:name="android.app.device_admin"
                         android:resource="@xml/lock_policy" />
        <intent-filter>
            <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
        </intent-filter>
</receiver>


5.デバイス管理ポリシー定義ファイルの追加

res/xml 以下にxmlファイルを作成する.

<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-policies>
    <force-lock/>
  </uses-policies>
</device-admin>



注意事項

  • デバイス管理者の権限がないとDeviceAdminReceiver.lockNow() メソッドが実行できない
  • デバイス管理者の付与はAndroid2.2からサポートされる


参考にしたサイト

DeviceAdminSample.java | Android Developers
http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.html

androidで画面をロックする方法がよく分からない。 - よせばいいのに
http://d.hatena.ne.jp/compound/20110813/1313245962

java - Android DevicePolicyManager lockNow() problem - Stack Overflow
http://stackoverflow.com/questions/6560426/android-devicepolicymanager-locknow-problem

[Android] Make your application a device administrator « Rootfs's Blog
http://rootfs.wordpress.com/2010/09/09/android-make-your-application-a-device-administrator/
※手順が丁寧に解説されていて役に立つ

0 件のコメント:

コメントを投稿