• Android简易实战教程--第五话《开发一键锁屏应用》


    转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51860900 点击打开链接

    Device Administration

    对于这个应用,市场上很多,但是看一下评论就知道效果有多差了,因为99%一键锁屏应用没办法卸载。今天就开发一个小应用,实现轻松点击一键锁屏,同时支持卸载。。。

    通查看谷歌原文档,有设备管理器的API,从这里可以抽取一些代码,开发出一个小应用,即即将介绍的《一键锁屏》。
    根据文档翻译,获取设备管理器的大致步骤如下:

    1,创建类DeviceAdminReceiver的子类

    如:com.itydl.lockscreen.DeviceAdminSample
    

    2,在清单文件中配置广播接收者

    <receiver
            android:name="com.itydl.lockscreen.DeviceAdminSample"
            android:description="@string/sample_device_admin_description"
            android:label="@string/sample_device_admin"
            android:permission="android.permission.BIND_DEVICE_ADMIN" >
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_admin_sample" />
    
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>
        </receiver>
    

    3,配置字符串相关信息

     <string name="activity_sample_device_admin">设备管理员</string>
    <string name="sample_device_admin">管理员</string>
    <string name="sample_device_admin_description">开启设备管理员,不开启扣2000块</string>
    

    4,在res目录下创建xml文件夹,在该文件夹下创建deviceadminsample.xml文件,内容:

       <device-admin xmlns:android="http://schemas.android.com/apk/res/android">
      <uses-policies>
        <limit-password />
        <watch-login />
        <reset-password />
        <force-lock />
        <wipe-data />
        <expire-password />
        <encrypted-storage />
        <disable-camera />
      </uses-policies>
    </device-admin>
    

    5,在代码中创建设备管理器和组件

    dpm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
        ComponentName who = new ComponentName(this, DeviceAdminSample.class);
    

    6,写功能

    dpm.lockNow();一键锁屏
    上述步骤有些晦涩,看一下实际操作步骤(建议通过阅读官网AP文档I一步步操作):

    1、把下方官方文档给出的配置文件的代码复制到自己创建的工程里面:


    复制过去发现报错了,因为三条描述属性信息没有配置,那么去String.xml中配置以下三条信息:
     <string name="activity_sample_device_admin">设备管理员</string>
    <string name="sample_device_admin">管理员</string>
    <string name="sample_device_admin_description">开启设备管理员,不开启扣2000块</string>
    删除掉配置文件中系统自带的activity节点信息。修改复制过来的activity标签name为我们工程的活动名称。

    此时还是报错,因为还有一个android:resource="@xml/device_admin_sample" 没有配置
    新建xml的文件夹,建一个device_admin_sample的文件,里面需要配置一些内容。把官方文档中的内容全部写入即可。
    内容如下:




    解决了报错问题。

    2、按照文档要求,新建一个class DeviceAdminSample extends DeviceAdminReceiver。这是一个广播接收者,里面不需要写任何内容
    记得把配置文件中活动和接收者名称修改为我们自己的。
     android:name="com.itydl.lockscreen.DeviceAdminSample"
    android:name="com.itydl.lockscreen.MainActivity"

    3、在活动中点击事件里面添加如下两行代码:

           DevicePolicyManager   dmp = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
           dmp.lockNow();//一键锁屏
    此时其实已经开发完毕了,运行后会报错,发现时没有“”拥有者“权限类似的错误信息。因为这仅仅对于程序员有效,进入设备管理器激活这个应用,再打开就可以使用了;对于用户,不知道在哪激活,根本得不得体验,所以还需要设置一键锁屏的时候,启动程序,先进入开启设备管理器活动的逻辑,让用户手动激活。
    具体的代码如下:
    清单文件:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.itydl.lockscreen"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="17" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            
            <activity
                android:name="com.itydl.lockscreen.MainActivity"
                android:label="一键锁屏" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
    
            <receiver
                android:name="com.itydl.lockscreen.DeviceAdminSample"
                android:description="@string/sample_device_admin_description"
                android:label="@string/sample_device_admin"
                android:permission="android.permission.BIND_DEVICE_ADMIN" >
                <meta-data
                    android:name="android.app.device_admin"
                    android:resource="@xml/device_admin_sample" />
    
                <intent-filter>
                    <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
                </intent-filter>
            </receiver>
    
        </application>
    
    </manifest>

    package com.itydl.lockscreen;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.app.admin.DevicePolicyManager;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.view.Menu;
    import android.view.View;
    
    public class MainActivity extends Activity {
    
    	private DevicePolicyManager dmp;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
                        //获取设备管理员对象
                    dmp = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
    	}
    
    	/**
    	 * 一键锁屏
    	 * 
    	 * @param v
    	 */
    	public void lockScreen(View v) {
    		// 如果没有激活设备管理员,提醒用户做事
    		ComponentName who = new ComponentName(this, DeviceAdminSample.class);
    		if (dmp.isAdminActive(who)) {// true表示已经激活,测试管理员是否已经激活。这里的who其实就是我们自定义的空的广播接收者
    			dmp.lockNow();// 一键锁屏
    
    		} else {
                               ////帮助用户打开激活设备管理器的界面,让用户手动激活
                             /**根据官方文档,写出启动设备管理器的活动
    			 * // Launch the activity to have the user enable our admin. Intent
    			   * intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    			 * intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
    			  * mDeviceAdminSample);
    			  * intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
    			 * mActivity.getString(R.string.add_admin_extra_app_text));
    			  * startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN);
    			 */
    			
    			 Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    			intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
    					  who);
    			 intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
    					  "设备管理器。。。");
    			 startActivityForResult(intent, 1);
    		}
    	}
    
    }
    

    此时记得去设备管理器取消激活。
    一键运行之后如下:



    点击一键锁屏后,自动跳转到设备管理器页面,按下Activiate。应用就生效了。

    这个时候应用算是开发完毕了,的确能实现锁屏功能,但是还有很多问题需要解决。
    你会发现此时的而应用和市场上评论一样,没法卸载!!!
    这样用户体验也很差,而且必须点开用用才能锁屏,那就没必要浪费时间点开一个应用去锁屏了。
    对于上面几个问题,在后边的博文中继续更新解决。
    已经开发完毕,见下一篇博客地址:http://blog.csdn.net/qq_32059827/article/details/51885687点击打开链接

  • 相关阅读:
    Codeforces 722C. Destroying Array
    Codeforces 722D. Generating Sets
    【BZOJ】3436: 小K的农场
    数论四·扩展欧几里德
    数论三·约瑟夫问题
    数论二·Eular质数筛法
    #1287 : 数论一·Miller-Rabin质数测试
    树的维护
    可持久化线段树
    【NOIP2016】天天爱跑步
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299644.html
Copyright © 2020-2023  润新知