概要
アプリケーションからデバイスをロック状態(スリープ)にする.
結構てこずったので手順をメモ.
手順
- android.app.admin.DeviceAdminReceiver をインポート
- DeviceAdminReceiver を継承したクラスを作成
- デバイス管理者権限の付与
- Manifest ファイルの定義
- デバイス管理ポリシー定義ファイルの追加
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/
※手順が丁寧に解説されていて役に立つ