当前位置: 代码迷 >> Android >> Android获取系统掩藏服务实现锁屏
  详细解决方案

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

热度:74   发布时间:2016-05-01 19:53:40.0
Android获取系统隐藏服务实现锁屏

?

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

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

?步骤:

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

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

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

4.获取服务中的方法

效果图:

????

?

注册MyAdmin广播接收者:

[html]?view plaincopy
  1. <receiver?android:name=".MyAdmin">??
  2. ????<meta-data?android:name="android.app.device_admin"??
  3. ????????android:resource="@xml/my_admin"?/>??
  4. ????<intent-filter>??
  5. ????????<action?android:name="android.app.action.DEVICE_ADMIN_ENABLED"?/>??
  6. ????</intent-filter>??
  7. </receiver>??


my_admin.xml:

[html]?view plaincopy
  1. <?xml?version="1.0"?encoding="utf-8"?>??
  2. <device-admin?xmlns:android="http://schemas.android.com/apk/res/android">??
  3. ????????<uses-policies>??
  4. ????????????????<limit-password?/>??
  5. ????????????????<watch-login?/>??
  6. ????????????????<reset-password?/>??
  7. ????????????????<force-lock?/>??
  8. ????????????????<wipe-data?/>??
  9. ????????</uses-policies>??
  10. </device-admin>??

反射获取服务、注册权限、实现锁屏:

[java]?view plaincopy
  1. public?class?LockActivity?extends?Activity?{??
  2. ????IDevicePolicyManager?mService;??
  3. ????@Override??
  4. ????public?void?onCreate(Bundle?savedInstanceState)?{??
  5. ????????super.onCreate(savedInstanceState);??
  6. ????????setContentView(R.layout.main);??
  7. ????}??
  8. ????//锁屏???
  9. ????public?void?lock(View?view){??
  10. ????????try?{??
  11. ????????????//通过反射获取到sdk隐藏的服务???
  12. ????????????Method?method?=?Class.forName("android.os.ServiceManager")??
  13. ????????????????????.getMethod("getService",?String.class);??
  14. ????????????IBinder?binder?=?(IBinder)?method.invoke(null,//激活服务??
  15. ????????????????????new?Object[]?{?Context.DEVICE_POLICY_SERVICE?});??
  16. ?????????????mService?=?IDevicePolicyManager.Stub.asInterface(binder);??
  17. ???????????????
  18. ?????????????//定义组件的名字???
  19. ?????????????ComponentName?mAdminName?=?new?ComponentName(this,?MyAdmin.class);??
  20. ??????????????
  21. ?????????????//注册权限??
  22. ?????????????if?(mService?!=?null)?{??
  23. ????????????????????//判断自定义的广播接受者?是不是被注册成?deviceadmin的权限???
  24. ????????????????????if?(!mService.isAdminActive(mAdminName))?{??
  25. ????????????????????????????????Intent?intent?=?new?Intent(??
  26. ????????????????????????????????DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);??
  27. ????????????????????????????????intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,??
  28. ????????????????????????????????????????mAdminName);??
  29. ????????????????????????????????startActivity(intent);??
  30. ????????????????????????????}??
  31. ????????????????????//调用服务实现锁屏???
  32. ????????????????????mService.lockNow();??
  33. ????????????????????//设置解锁密码??
  34. ????????????????????mService.resetPassword("123",?0);??
  35. ?????????????}??
  36. ????????}?catch?(Exception?e)?{??
  37. ????????????e.printStackTrace();??
  38. ????????}???
  39. ????}??
  40. }??


AIDL:

[java]?view plaincopy
  1. /*?
  2. **?
  3. **?Copyright?2010,?The?Android?Open?Source?Project?
  4. **?
  5. **?Licensed?under?the?Apache?License,?Version?2.0?(the?"License");?
  6. **?you?may?not?use?this?file?except?in?compliance?with?the?License.?
  7. **?You?may?obtain?a?copy?of?the?License?at?
  8. **?
  9. **?????http://www.apache.org/licenses/LICENSE-2.0?
  10. **?
  11. **?Unless?required?by?applicable?law?or?agreed?to?in?writing,?software?
  12. **?distributed?under?the?License?is?distributed?on?an?"AS?IS"?BASIS,?
  13. **?WITHOUT?WARRANTIES?OR?CONDITIONS?OF?ANY?KIND,?either?express?or?implied.?
  14. **?See?the?License?for?the?specific?language?governing?permissions?and?
  15. **?limitations?under?the?License.?
  16. */??
  17. ??
  18. package?android.app.admin;??
  19. ??
  20. import?android.content.ComponentName;??
  21. /**?
  22. ?*?Internal?IPC?interface?to?the?device?policy?service.?
  23. [email protected]}?
  24. ?*/??
  25. interface?IDevicePolicyManager?{??
  26. ????void?setPasswordQuality(in?ComponentName?who,?int?quality);??
  27. ????int?getPasswordQuality(in?ComponentName?who);??
  28. ??????
  29. ????void?setPasswordMinimumLength(in?ComponentName?who,?int?length);??
  30. ????int?getPasswordMinimumLength(in?ComponentName?who);??
  31. ??????
  32. ????boolean?isActivePasswordSufficient();??
  33. ????int?getCurrentFailedPasswordAttempts();??
  34. ??????
  35. ????void?setMaximumFailedPasswordsForWipe(in?ComponentName?admin,?int?num);??
  36. ????int?getMaximumFailedPasswordsForWipe(in?ComponentName?admin);??
  37. ??????
  38. ????boolean?resetPassword(String?password,?int?flags);??
  39. ??????
  40. ????void?setMaximumTimeToLock(in?ComponentName?who,?long?timeMs);??
  41. ????long?getMaximumTimeToLock(in?ComponentName?who);??
  42. ??????
  43. ????void?lockNow();??
  44. ??????
  45. ????void?wipeData(int?flags);??
  46. ??????
  47. ????void?setActiveAdmin(in?ComponentName?policyReceiver);??
  48. ????boolean?isAdminActive(in?ComponentName?policyReceiver);??
  49. ????List<ComponentName>?getActiveAdmins();??
  50. ????boolean?packageHasActiveAdmins(String?packageName);??
  51. ????void?removeActiveAdmin(in?ComponentName?policyReceiver);??
  52. ??????
  53. ????void?setActivePasswordState(int?quality,?int?length);??
  54. ????void?reportFailedPasswordAttempt();??
  55. ????void?reportSuccessfulPasswordAttempt();??
  56. }??
  相关解决方案