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

推荐安卓开发神器(里面有各种UI特效和android代码库实例)

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

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

 步骤:

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

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

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

4.获取服务中的方法

效果图:

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

注册MyAdmin广播接收者:

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();  
}  

相关推荐