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

原文地址:http://blog.csdn.net/furongkang/article/details/6893299

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

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

 步骤:

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

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

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

4.获取服务中的方法

效果图:

  

 

注册MyAdmin广播接收者:

[html]  view plain copy
  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 plain copy
  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 plain copy
  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 plain copy
  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.  * {@hide} 
  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. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值