Android KeyguardManager或IDevicePolicyManager鎖屏

Android屏幕保護KeyguardManager


Android手機通常不用時,都會經過電源鍵來鎖定屏幕同時關閉屏幕燈。java


鎖定效果:android

要讓本身的應用實現該屏幕鎖定,主要須要用到如下幾個類:DevicePolicyManager 
這是設備管理的主類。經過它能夠實現屏幕鎖定、屏幕亮度調節、出廠設置等功能。app

DeviceAdminReceiver 
該類繼承自 BroadcastReceiver 。 從源碼能夠看到,其實就是實現了一個OnReceive方法,該方法中根據不一樣的Action,執行相應的操做。 好比,若是激活成功,那麼Action就是ACTION_DEVICE_ADMIN_ENABLED, 據此調用 onEnabled 方法。ide

系統源碼:this

/**
     * Intercept standard device administrator broadcasts.  Implementations
     * should not override this method; it is better to implement the
     * convenience callbacks for each action.
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_PASSWORD_CHANGED.equals(action)) {
            onPasswordChanged(context, intent);
        } else if (ACTION_PASSWORD_FAILED.equals(action)) {
            onPasswordFailed(context, intent);
        } else if (ACTION_PASSWORD_SUCCEEDED.equals(action)) {
            onPasswordSucceeded(context, intent);
        } else if (ACTION_DEVICE_ADMIN_ENABLED.equals(action)) {
            onEnabled(context, intent);
        } else if (ACTION_DEVICE_ADMIN_DISABLE_REQUESTED.equals(action)) {
            CharSequence res = onDisableRequested(context, intent);
            if (res != null) {
                Bundle extras = getResultExtras(true);
                extras.putCharSequence(EXTRA_DISABLE_WARNING, res);
            }
        } else if (ACTION_DEVICE_ADMIN_DISABLED.equals(action)) {
            onDisabled(context, intent);
        }
    }

具體中的簡單引用:spa

屏幕鎖定和恢復出廠設置
.net

1.建立 MyAdmin 的廣播接受者 繼承 DeviceAdminReceivercode

        <receiver android:name=".MyAdmin">
            <meta-data android:name="android.app.device_admin"
                android:resource="@xml/my_admin" />
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>
        </receiver>

my_admin.xmlcomponent

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

2.註冊廣播接受者爲admin設備orm

ComponentName mAdminName = new ComponentName(this, MyAdmin.class);
if (mService != null) {
        if (!mService.isAdminActive(mAdminName)) {
                    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                    intent.putExtra (DevicePolicyManager.EXTRA_DEVICE_ADMIN,mAdminName);
                    startActivity(intent);
                }
}

3.獲取IDevicePolicyManager

public void lockScreen()
{
        DevicePolicyManager  dm =  (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
        ComponentName componentName = new ComponentName(this, MyDeviceAdmin.class);
        boolean isAdminActive = devicePolicyManager.isAdminActive(componentName);
        if(isAdminActive) //是否得到權限
        {
            dm.resetPassword("123", 0);  //滑動解鎖屏幕條後須要輸入密碼(方法中新設置的密碼)才能真正解鎖
            dm.lockNow();
            //dm.setMaximumTimeToLock(mDeviceComponentName, timeout); 相應時間後鎖屏
         //恢復出廠設置.
         //dm.wipeData(0);
      }else{  //獲取管理員權限
           Intent intent = new Intent(
                    DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,mDeviceComponentName);
            intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,"這裏能夠輸入一些額外的說明,好比提示用戶什麼的");
            startActivityForResult(intent, RESULT_ENABLE_LOCKVIEW);
      }
 }
 
 
  protected void onActivityResult(int paramInt1, int paramInt2, Intent paramIntent)
  {
    super.onActivityResult(paramInt1, paramInt2, paramIntent);
     DevicePolicyManager  dm =  (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
     ComponentName componentName = new ComponentName(this, MyDeviceAdmin.class);
        boolean isAdminActive = devicePolicyManager.isAdminActive(componentName);
    if (paramInt1 == RESULT_ENABLE_LOCKVIEW && isAdminActive)
    {
        lockScreen();
    }
    else{
          Toast.makeText(this, "激活失敗,沒法得到管理員權限", 1).show();
      }
  }

4.MyDeviceAdmin

import android.app.admin.DeviceAdminReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.widget.Toast;

public class MyDeviceAdmin extends DeviceAdminReceiver
{
  public static String PREF_MAX_FAILED_PW;
  public static String PREF_PASSWORD_LENGTH;
  public static String PREF_PASSWORD_QUALITY = "password_quality";

  static
  {
    PREF_PASSWORD_LENGTH = "password_length";
    PREF_MAX_FAILED_PW = "max_failed_pw";
  }

  public static SharedPreferences getDevicePreference(Context paramContext)
  {
    return paramContext.getSharedPreferences(DeviceAdminReceiver.class.getName(), 0);
  }

  public CharSequence onDisableRequested(Context paramContext, Intent paramIntent)
  {
    return "這是一個可選的消息,警告有關禁止用戶的請求";
  }

  public void onDisabled(Context paramContext, Intent paramIntent)
  {
    showToast(paramContext, "設備管理:不可用");
  }

  public void onEnabled(Context paramContext, Intent paramIntent)
  {
    showToast(paramContext, "設備管理:可用");
  }

  public void onPasswordChanged(Context paramContext, Intent paramIntent)
  {
    showToast(paramContext, "設備管理:密碼己經改變");
  }

  public void onPasswordExpiring(Context paramContext, Intent paramIntent)
  {
    showToast(paramContext, "設備管理:密碼過時");
    super.onPasswordExpiring(paramContext, paramIntent);
  }

  public void onPasswordFailed(Context paramContext, Intent paramIntent)
  {
    showToast(paramContext, "設備管理:輸入密碼錯誤");
  }

  public void onPasswordSucceeded(Context paramContext, Intent paramIntent)
  {
  }

  void showToast(Context paramContext, CharSequence paramCharSequence)
  {
    Toast.makeText(paramContext, paramCharSequence, 0).show();
  }
}

  <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>

 <uses-permission android:name="android.permission.WAKE_LOCK"/

相關文章
相關標籤/搜索