- /**
- * Make the device lock immediately, as if the lock screen timeout has
- * expired at the point of this call.
- *
- * <p>The calling device admin must have requested
- * {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} to be able to call
- * this method; if it has not, a security exception will be thrown.
- */
- public void lockNow() {
- if (mService != null) {
- try {
- mService.lockNow();
- } catch (RemoteException e) {
- Log.w(TAG, "Failed talking with device policy service", e);
- }
- }
- }
这段代码告诉我们 如果你想锁住屏幕 你必须获得 USES_POLICY_FORCE_LOCK 权限,那么在我们锁屏幕之前就必须请求权限
代码如下:
- ComponentName mComponentName = new ComponentName(TestDeviceScreenLock.this, AdminReceiver.class);
- Intent intent = new Intent(DevicePolicyManager.ACTIntent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
- intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,mComponentName);
- intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,"Additional text explaining why this needs to be added.");
- startActivityForResult(intent, 1);
TestDeviceScreenLock.this 就是Context的继承类
AdminReceiver.class是一个DeviceAdminReceiver 此类继承 BroadcastReceiver
但是锁屏之后 不容易解屏 必须得按BACK键 不知是为什么?望高手解答...
- TestAndroid.rar (12.5 KB)
- 下载次数: 19
实现原理:当按锁屏键时,会发出一个广播,当界面接收到一个广播就可以实现锁频。我们可以调用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();
- }
实现原理:当按锁屏键时,会发出一个广播,当界面接收到一个广播就可以实现锁频。我们可以调用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();
}
摘自:傅荣康专栏