您的位置:首页 > 移动开发 > Android开发

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

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

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

步骤:

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

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

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

4.获取服务中的方法

效果图:







注册MyAdmin广播接收者:



view
plain

<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:

view
plain

<?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>

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

view
plain

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:

view
plain

/*

**

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息