Android获取系统隐藏服务实现锁屏?实现原理:当按锁屏键时,会发出一个广播,当界面接收到一个广播就可以实现
Android获取系统隐藏服务实现锁屏
?
实现原理:当按锁屏键时,会发出一个广播,当界面接收到一个广播就可以实现锁频。我们可以调用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.??*?{@hide}??*/??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();??}??