?
实现原理:当按锁屏键时,会发出一个广播,当界面接收到一个广播就可以实现锁频。我们可以调用IDevicePolicyManager服务中的lockNow方法来发送一个广播实现锁屏。
IDevicePolicyManager是被系统隐藏掉的,需要通过反射还获取此服务。
?步骤:
1.创建MyAdmin的广播接收者继承DeviceAdminReceiver
2.通过反射 ,获取IDevicePolicyManager服务 ,IDevicePolicyManager通过AIDL来获取出来。
3.注册广播接收者为admin设备
4.获取服务中的方法
效果图:
????
?
注册MyAdmin广播接收者:
- <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.xml:
- <?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>??
反射获取服务、注册权限、实现锁屏:
- public?class?LockActivity?extends?Activity?{??
- ????IDevicePolicyManager?mService;??
- ????@Override??
- ????public?void?onCreate(Bundle?savedInstanceState)?{??
- ????????super.onCreate(savedInstanceState);??
- ????????setContentView(R.layout.main);??
- ????}??
- ????//锁屏???
- ????public?void?lock(View?view){??
- ????????try?{??
- ????????????//通过反射获取到sdk隐藏的服务???
- ????????????Method?method?=?Class.forName("android.os.ServiceManager")??
- ????????????????????.getMethod("getService",?String.class);??
- ????????????IBinder?binder?=?(IBinder)?method.invoke(null,//激活服务??
- ????????????????????new?Object[]?{?Context.DEVICE_POLICY_SERVICE?});??
- ?????????????mService?=?IDevicePolicyManager.Stub.asInterface(binder);??
- ???????????????
- ?????????????//定义组件的名字???
- ?????????????ComponentName?mAdminName?=?new?ComponentName(this,?MyAdmin.class);??
- ??????????????
- ?????????????//注册权限??
- ?????????????if?(mService?!=?null)?{??
- ????????????????????//判断自定义的广播接受者?是不是被注册成?deviceadmin的权限???
- ????????????????????if?(!mService.isAdminActive(mAdminName))?{??
- ????????????????????????????????Intent?intent?=?new?Intent(??
- ????????????????????????????????DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);??
- ????????????????????????????????intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,??
- ????????????????????????????????????????mAdminName);??
- ????????????????????????????????startActivity(intent);??
- ????????????????????????????}??
- ????????????????????//调用服务实现锁屏???
- ????????????????????mService.lockNow();??
- ????????????????????//设置解锁密码??
- ????????????????????mService.resetPassword("123",?0);??
- ?????????????}??
- ????????}?catch?(Exception?e)?{??
- ????????????e.printStackTrace();??
- ????????}???
- ????}??
- }??
AIDL:
- /*?
- **?
- **?Copyright?2010,?The?Android?Open?Source?Project?
- **?
- **?Licensed?under?the?Apache?License,?Version?2.0?(the?"License");?
- **?you?may?not?use?this?file?except?in?compliance?with?the?License.?
- **?You?may?obtain?a?copy?of?the?License?at?
- **?
- **?????http://www.apache.org/licenses/LICENSE-2.0?
- **?
- **?Unless?required?by?applicable?law?or?agreed?to?in?writing,?software?
- **?distributed?under?the?License?is?distributed?on?an?"AS?IS"?BASIS,?
- **?WITHOUT?WARRANTIES?OR?CONDITIONS?OF?ANY?KIND,?either?express?or?implied.?
- **?See?the?License?for?the?specific?language?governing?permissions?and?
- **?limitations?under?the?License.?
- */??
- ??
- package?android.app.admin;??
- ??
- import?android.content.ComponentName;??
- /**?
- ?*?Internal?IPC?interface?to?the?device?policy?service.?
- [email protected]}?
- ?*/??
- interface?IDevicePolicyManager?{??
- ????void?setPasswordQuality(in?ComponentName?who,?int?quality);??
- ????int?getPasswordQuality(in?ComponentName?who);??
- ??????
- ????void?setPasswordMinimumLength(in?ComponentName?who,?int?length);??
- ????int?getPasswordMinimumLength(in?ComponentName?who);??
- ??????
- ????boolean?isActivePasswordSufficient();??
- ????int?getCurrentFailedPasswordAttempts();??
- ??????
- ????void?setMaximumFailedPasswordsForWipe(in?ComponentName?admin,?int?num);??
- ????int?getMaximumFailedPasswordsForWipe(in?ComponentName?admin);??
- ??????
- ????boolean?resetPassword(String?password,?int?flags);??
- ??????
- ????void?setMaximumTimeToLock(in?ComponentName?who,?long?timeMs);??
- ????long?getMaximumTimeToLock(in?ComponentName?who);??
- ??????
- ????void?lockNow();??
- ??????
- ????void?wipeData(int?flags);??
- ??????
- ????void?setActiveAdmin(in?ComponentName?policyReceiver);??
- ????boolean?isAdminActive(in?ComponentName?policyReceiver);??
- ????List<ComponentName>?getActiveAdmins();??
- ????boolean?packageHasActiveAdmins(String?packageName);??
- ????void?removeActiveAdmin(in?ComponentName?policyReceiver);??
- ??????
- ????void?setActivePasswordState(int?quality,?int?length);??
- ????void?reportFailedPasswordAttempt();??
- ????void?reportSuccessfulPasswordAttempt();??
- }??