Android锁屏功能的开发与实现

来源:互联网 发布:水文地质钻孔数据 编辑:程序博客网 时间:2024/05/20 12:22

1.手机里系统自带了个一键锁屏的app,一时好奇研究了会,终于也实现了。博客也是好久没写了,东西做出来很久了,今天拿出来分享一下

扯点别的犊子,大半年都在忙着考研,没时间写博客,也是很惭愧呀,今天抽点时间把箱子翻一翻,看了一眼文件夹,还是还有很多东西能写的,乱系八糟的还有一堆东西做了,还没写过博客记录的。以后晚上回来就多抽时间补一补吧

2.不废话了,直接看看效果图吧,不过吧,锁屏也没什么图能截的,最好是把我最后给的源码里的apk安装体验一下吧

这里写图片描述

3.代码不长,主要一点需要说明,由于权限问题,需要每次锁屏前判断是否具有相关权限,即为代码中的activeManager方法,当然也可以直接在初始化时调用一次就行,就不多分析了,贴一部分代码吧,话都写在代码里了

public class MainActivity extends AppCompatActivity {    float LightOld=0;    boolean flag=true;    private DevicePolicyManager policyManager;    private ComponentName componentName;    private SensorManager sensorManager;    /*        private TextView lightLevel;        private TextView AccLevel;    */    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //获取设备管理服务        policyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);        //获取系统传感器的管理器        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);        //得到 光照传感器        Sensor sensorLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);        Sensor sensorAcc = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);        // 光照传感器注册(register)监听,参数为(SensorEventListener实例,传感器对象,输出信息速率)        sensorManager.registerListener(listenerLight, sensorLight, SensorManager.SENSOR_DELAY_NORMAL);        //同理。。        sensorManager.registerListener(listenerAcc,sensorAcc,SensorManager.SENSOR_DELAY_NORMAL);        //AdminReceiver 继承自 DeviceAdminReceiver        componentName = new ComponentName(this, LockReceiver.class);        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Lock();            }        });    }      void Lock(){        if (policyManager.isAdminActive(componentName)) {            policyManager.lockNow();            //关闭当前app  当然了也可以选择不关闭            android.os.Process.killProcess(android.os.Process.myPid());        }else{            activeManager ();        }    }    private void activeManager() {        //使用隐式意图调用系统方法激活指定的设备管理器        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);        intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,"一键锁屏");        startActivity(intent);    }    private SensorEventListener listenerLight = new SensorEventListener() {        @Override        public void onSensorChanged(SensorEvent event) {            if(flag){                flag=false;                LightOld=event.values[0];                return;            }            float value = event.values[0];            //这里判断条件为当光线变化超过120时锁屏。实际测试发现            //不太好用,建议使用变化超过LightOld的百分比比较合理            if(Math.abs(value-LightOld)>120) {                Toast.makeText(MainActivity.this,""+Math.abs(value-LightOld),Toast.LENGTH_SHORT ).show();                LightOld = value;                Lock();            }            //lightLevel.setText("Current light level is " + value + " lx");        }        @Override        public void onAccuracyChanged(Sensor sensor, int accuracy) {        }    };    private SensorEventListener listenerAcc= new SensorEventListener() {        @Override        public void onSensorChanged(SensorEvent event) {              //传感器数据发生变化时            float xValue = Math.abs(event.values[0]);            float yValue = Math.abs(event.values[1]);            float zValue = Math.abs(event.values[2]);            if(xValue>15||yValue>15||zValue>50){                //Toast.makeText(MainActivity.this, "摇一摇", Toast.LENGTH_SHORT).show();                Lock();            }        }        @Override        public void onAccuracyChanged(Sensor sensor, int accuracy) {        }    };    @Override    protected void onDestroy() {        super.onDestroy();        if (sensorManager != null) {            //注销监听            sensorManager.unregisterListener(listenerLight);            sensorManager.unregisterListener(listenerAcc);        }    }}

4.还要补充说明的一点时,锁屏功能需要另外一些配置,直接看Manifest文件里面相关配置吧,也可以看到不需要什么权限,但是要激活设备管理器

<application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <receiver            android:name=".LockReceiver">            <meta-data                android:name="android.app.device_admin"                android:resource="@xml/lock_screen" />                /*这个文件内容也很少                <?xml version="1.0" encoding="utf-8"?>                <device-admin xmlns:android="http://schemas.android.com/apk/res/android">                    <uses-policies>                        <force-lock />                    </uses-policies>                </device-admin>            */            <intent-filter>                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />            </intent-filter>        </receiver>    </application>

5.最后最重要的就是献上代码了,看代码就更清楚了,给出github地址,欢迎star,笔者能力有限,不足之处,欢迎留言讨论

源码请点击–》https://github.com/xugongming38/Perfect-Lock