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


    引用:http://www.2cto.com/kf/201110/108575.html

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

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

     步骤:

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

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

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

    4.获取服务中的方法

    效果图:

       

    \" src=  
    \" src=  
    \" src=

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

  • 相关阅读:
    mybatisplus学习
    JSON数组读取和保存
    XML文件读写示例
    JSON代码示例
    Delphi接口示例代码
    获得wav语音文件时长
    javaweb注册页面学习之路(三)
    javaweb注册页面学习之路(二)
    javaweb注册页面学习之路(一)
    Django 目录
  • 原文地址:https://www.cnblogs.com/sode/p/2732933.html
Copyright © 2020-2023  润新知