IDevicePolicyManager实现锁屏

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Unity中实现安卓锁屏需要使用Android锁屏API。以下是实现步骤: 1. 创建一个Java,用于调用Android锁屏API。在Unity项目中创建一个Plugins/Android文件夹,然后在该文件夹下创建一个java文件,例如LockScreen.java。 2. 在该Java中,调用Android的KeyguardManager和KeyguardLock,使用KeyguardManager.lock方法锁定屏幕。 3. 在Unity中编写C#代码,调用Java中的锁屏方法。使用AndroidJavaClass和AndroidJavaObject创建Java的实例,并调用Java方法。 下面是一个简单的示例代码: Java LockScreen.java: ``` package com.example.lockscreen; import android.app.KeyguardManager; import android.app.KeyguardManager.KeyguardLock; import android.content.Context; public class LockScreen { public static void lock(Context context) { KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); KeyguardLock kl = km.newKeyguardLock("MyApp"); kl.disableKeyguard(); } } ``` Unity中的C#代码: ``` using UnityEngine; using System.Collections; public class LockScreen : MonoBehaviour { void Start() { AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); AndroidJavaClass lockClass = new AndroidJavaClass("com.example.lockscreen.LockScreen"); lockClass.CallStatic("lock", jo); } } ``` 需要注意的是,该示例代码仅供参考,实际实现中可能需要根据具体需求进行修改。同时,由于涉及到Android的API调用,需要在Unity中设置相关的Android权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值