Android获取系统掩藏服务实现锁屏

Android获取系统隐藏服务实现锁屏?实现原理:当按锁屏键时,会发出一个广播,当界面接收到一个广播就可以实现

Android获取系统隐藏服务实现锁屏

?

实现原理:当按锁屏键时,会发出一个广播,当界面接收到一个广播就可以实现锁频。我们可以调用IDevicePolicyManager服务中的lockNow方法来发送一个广播实现锁屏。

IDevicePolicyManager是被系统隐藏掉的,需要通过反射还获取此服务。

?步骤:

1.创建MyAdmin的广播接收者继承DeviceAdminReceiver

2.通过反射 ,获取IDevicePolicyManager服务 ,IDevicePolicyManager通过AIDL来获取出来。

3.注册广播接收者为admin设备

4.获取服务中的方法

效果图:

Android获取系统掩藏服务实现锁屏??Android获取系统掩藏服务实现锁屏??Android获取系统掩藏服务实现锁屏

?

注册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();??
  • }??