Android编程获取系统隐藏服务实现锁屏的方法

所属分类: 软件编程 / Android 阅读数: 894
收藏 0 赞 0 分享

本文实例讲述了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();
}

希望本文所述对大家Android程序设计有所帮助。

更多精彩内容其他人还在看

Retrofit2日志拦截器的使用

这篇文章主要介绍了Retrofit2日志拦截器的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android创建外部lib库及自定义View的图文教程

这篇文章主要给大家介绍了关于Android创建外部lib库及自定义View的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android分享微信小程序失败的一些事小结

这篇文章主要给大家介绍了关于Android分享微信小程序失败一些事,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android分享微信小程序技巧之图片优化

这篇文章主要给大家介绍了关于Android分享微信小程序技巧之图片优化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android Viewpager实现无限循环轮播图

这篇文章主要为大家详细介绍了Android Viewpager实现无限循环轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android中的Bitmap序列化失败的解决方法

这篇文章主要介绍了Android中的Bitmap序列化失败的解决方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Android自定义通用标题栏CustomTitleBar

这篇文章主要为大家详细介绍了Android自定义通用标题栏CustomTitleBar,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android组合控件自定义标题栏

这篇文章主要为大家详细介绍了Android组合控件自定义标题栏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android自定义复合控件实现通用标题栏

这篇文章主要为大家详细介绍了Android自定义复合控件实现通用标题栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

ExpandableListView实现简单二级列表

这篇文章主要为大家详细介绍了ExpandableListView实现简单二级列表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多