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



评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傅荣康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值