作者punk86862001 (赵MAN)
看板AndroidDev
标题[分享] 实作一键锁屏功能 Lock Screen And Off
时间Wed Jan 15 22:02:09 2014
有图网志有排版好读版
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