AndroidDev 板


LINE

有图网志有排版好读版 http://goo.gl/8QyDzd ------ 前言 市面上有许多一键锁屏的软体,在 Google Play 上可以找到 一堆 https://play.google.com/store/search?q=%E4%B8%80%E9%8D%B5%E9%8E%96%E5%B1%8F 这类型的软体,不外乎是想要像 iOS 内建的 AssistiveTouch 一样, 透过点击萤幕上的 icon 来关掉萤幕,减少电源键因为按压次数过多所导致的损耗! 我们以 一键锁屏 这个 App 为例子 https://play.google.com/store/apps/details?id=wq.lockscreen 当使用者下载了以後,只要放在桌面上的任何位置,如下左图 第一次点击时会进到 Android 系统的装置管理员页面 让使用者再次确认此 App 所需要的权限,如下右图 一旦点选「启用」以後,下次再次点选就会直接关掉萤幕不会再跳出提示 这种类型的权限通常会比 Market 上的权限还要来的更进阶 某些可以取得将整只手机重设的权限,所以使用上要特别注意! 另一个值得注意的地方,就是当此类型的 App 启用装置管理员以後 我们并不能直接将 App 移除! 必须先到 设定 > 安全性 > 装置管理员 里头取消此 App 的勾选 才能够正常移除! 以下我们就要来实作这样子一键锁屏的功能! Step 1: 设定 DeviceAdminReceiver deviceAdminReceiver.class 由於会存取到系统的装置管理员权限, 我们必须透过 DeviceAdminReceiver来帮我们处理 首先先建立一个新的 class deviceAdminReceiver public class deviceAdminReceiver extends DeviceAdminReceiver { } 不要怀疑你的眼睛,里面不用实作任何东西没有错! res/xml/device_admin.xml 接着在 res 资料夹底下新增资料夹 xml 并在 xml 下新增 device_admin.xml 档 由於我们只需要自动屏的功能, 因此在 user-policies 底下只需要 force-lock 的权限 <device-admin xmlns:Android="http://schemas.android.com/apk/res/android" > <!-- limit-password 设置密码的规则 watch-login 监控屏幕解锁尝试次数 reset-password 更改屏幕解锁密码 force-lock 设备自动锁屏 wipe-data 删除全部的数据 --> <uses-policies> <force-lock /> </uses-policies> </device-admin> AndroidManifest.xml 记得要在 manifest 底下加入刚才的 deviceAdminReceiver 的资讯 注意在这里我们加入了 android.permission.BIND_DEVICE_ADMIN 来让我们取得装置管理员的资料 <receiver android:name=".deviceAdminReceiver" android:description="@string/description" android:label="@string/app_name" android:permission="android.permission.BIND_DEVICE_ADMIN" > <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver> res/values/strings.xml Receiver 底下可以加入 description 目的只是在装置管理员底下会出现的文字叙述 这边不设定也没有关系 <string name="description">Designed by Kenji Chao</string> Step 2: Activity 设定 LockScreenAndOffActivity 在你的 launch activity 一开始加入以下两行 REQUEST_CODE 是之後在接 onActivityResult 所需要的常数 devicePolicyManager 是实际上执行锁屏的实体 private final int REQUEST_CODE = 100; DevicePolicyManager devicePolicyManager; 接着修改onCreate 记住这边我们并不需要一个 UI 介面来操作我们的 Activity 所以可以不用 setContentView 我们先判断装置管理员有没有被勾选 没被勾选就使用 intent 导入启用的页面 有被勾选直接进行锁屏,并且关闭这个 Activity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_lock_screen_and_off); ComponentName componentName = new ComponentName(getApplicationContext(), deviceAdminReceiver.class); devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); // 侦测装置管理员是否被勾选 boolean isAdminActive = devicePolicyManager.isAdminActive(componentName); if (!isAdminActive) { Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "若要解除安装此程式,请至 设定 > 安全性 > 装置管理员 内取消此 App 的勾选"); startActivityForResult(intent, REQUEST_CODE); } else { // 锁屏 devicePolicyManager.lockNow(); finish(); } } 如果只有上面那段程式码 在第一次启用时并不会进行锁屏 所以我们要实作 onActivityResult 利用前面宣告的 REQUEST_CODE 来判断是从原来的 Activity 发出 intent 回来的 如果使用者确认启用就执行锁屏 同样的最後执行 finish() 来关闭此 Activity protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE) { if (resultCode == RESULT_OK) { devicePolicyManager.lockNow(); } finish(); } } AndroidManifest.xml 最後再做一点细部修改 在 manifest 的 application tag 底下加入这行 让整个 Application 是不显示 UI 的 android:theme="@android:style/Theme.NoDisplay" 如果没有加的话开启这个 app 会闪一下 代表实际上有开启 UI 只是马上又被 finish 了 总结 在这次我们学到了透过 deviceAdminReceiver 来取得更高的使用权限 虽然程式码不多 但是从这些设定我们仍旧学到了蛮实用的功能! 很简单吧! --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 36.224.175.45 ※ 编辑: punk86862001 来自: 36.224.175.45 (01/15 22:03)
1F:推 sdyy:原来有nodisplay阿 我以前都是用透明那个 01/15 22:25
2F:→ sdyy:不过有些系统用locknow会失败 例如小米... 01/15 22:27
3F:→ punk86862001:小米机本身有bug...内建的设定应用程式点选有出现 01/15 22:58
4F:→ punk86862001:...的icon要叫出进阶选单时会crash 01/15 22:58
5F:推 asadman1523:谢谢分享!!!!!! 01/15 23:48
6F:推 Fonger:推!! 01/15 23:57
7F:推 ian90911:推分享 01/16 01:22
8F:推 sorkayi:推分享 01/16 12:24
9F:推 dementia:推 01/16 15:18
10F:推 nonebelieve:推! 我以前也做过类似的~ 01/16 17:04
11F:推 pkmilk:推 01/17 23:05







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP