題記:
這個app完全是拾人牙慧,作為練手用的,其實沒有什么原創的東西。當然,博客還是我自己寫的,記錄下來,對自己也算是一種成長吧。
轉載請注明原文地址:
http://www.cnblogs.com/yanyojun/p/6479686.html
這篇博客很多部分參看了 http://blog.csdn.net/chencaishengsic/article/details/50765355
1、一鍵鎖屏功能介紹
物理按鍵總是容易損壞的,在Android系統上,大家通常習慣按電源鍵來鎖定屏幕;那有沒有像IOS系統上懸浮按鈕式的點擊下鎖定屏幕呢?下面實現這么一個功能。
上圖中,有一個一鍵鎖屏的應用圖標,點擊下,手機就可以鎖定屏幕了。
2、源碼
先創建一個繼承自DeviceAdminReceiver的子類,這個只需要有一個實例就可以了,用來接收靜態廣播,里面不需要任何的邏輯實現,代碼如下:
1 package com.plbear.qlock; 2 3 import android.app.admin.DeviceAdminReceiver; 4 5 /** 6 * Created by Yanyongjun on 2017/1/16. 7 */ 8 9 public class AdminManageReceiver extends DeviceAdminReceiver { 10 }
先建立一個Activity,在onCreate方法中獲取DevicePolicyManager設備管理器實例。如下
1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 mAdminName = new ComponentName(this, AdminManageReceiver.class); 5 //獲取設備管理器 6 DevicePolicyManager mDPM = (DevicePolicyManager) this.getSystemService(Context.DEVICE_POLICY_SERVICE); 7 //如果還沒有激活設備管理器,則直接進入到設備管理器界面 8 if (!mDPM.isAdminActive(mAdminName)) { 9 showAdminManage(); 10 } 11 //如果已經有了設備管理器的權限,則鎖定屏幕 12 if (mDPM.isAdminActive(mAdminName)) { 13 mDPM.lockNow(); 14 } 15 finish(); 16 }
可以看到上面的Activity其實是非常簡單的,並沒有什么界面。
其中,showAdminManage方法這么去實現。
1 private void showAdminManage() { 2 Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); 3 intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,mAdminName); 4 intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,R.string.app_name); 5 startActivityForResult(intent,-1); 6 }
走到這里大部分的業務邏輯已經實現了,但是其實還是不能工作的,有以下幾個問題:
2.1 點擊圖標之后app出現閃爍下滅屏
這個app雖然沒有前台界面,但是加載的時候還是會閃一下,這個時候需要在AndroidManifest.xml中定義下style就可以了,如下
1 <activity android:name=".MainActivity" 2 android:label="@string/app_name" 3 android:theme="@android:style/Theme.NoDisplay" //將主題設置為NoDisplay之后就可以不閃爍了 4 android:excludeFromRecents="true" 5 >
2.2 設備管理器中怎么之后申請什么權限呢?
我們可以看到在設備管理器中申請權限的界面如下:
那設備管理器怎么之后要申請的是“鎖屏”呢?
在AndroidManfiest.xml中這么寫
1 <receiver 2 android:name=".AdminManageReceiver" 3 android:label="@string/app_name" 4 android:permission="android.permission.BIND_DEVICE_ADMIN" > 5 <meta-data 6 android:name="android.app.device_admin" 7 android:resource="@xml/device_admin"> 8 </meta-data> 9 <intent-filter> 10 <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> 11 </intent-filter> 12 </receiver>
如上面所示,這個靜態廣播中,定義一個
<meta-data>
</meta-data>
則設備管理器就會根據里面的name字段自動去查找resource字段,其中,device_admin.xml這么寫:
1 <device-admin xmlns:android="http://schemas.android.com/apk/res/android"> 2 <uses-policies> 3 <force-lock /> 4 </uses-policies> 5 </device-admin>
這個地方申明下我需要申請的“鎖屏”權限。
好了,按照上面就可以簡單的實現了,源碼可以看我的github:
https://github.com/YanYoJun/QLock
這里遺留一個有趣的問題,其實meta-data這個字段是很神奇的,后面有時間寫一篇文章申請下。
3、設備管理器的使用
如果只是上面的內容,那這篇博客實在是乏善可陳,既然用到了設備管理器,那就順帶學習下設備管理器怎么使用吧。
設備管理器總的介紹見 https://developer.android.google.cn/guide/topics/admin/device-admin.html
DevicePolicyManager介紹見:https://developer.android.google.cn/reference/android/app/admin/DevicePolicyManager.html
DeviceAdminreceiver介紹見:https://developer.android.google.cn/reference/android/app/admin/DeviceAdminReceiver.html
總的來說,設備管理器主要可以來做以下七個方面的事情,為了形象,我們寫 一個簡單的測試apk來依次實現以下功能:
3.1 手機密碼相關
3.2 鎖屏
3.3 擦除數據
3.4 禁止相機使用
3.5 數據加密存儲
3.6 提高其他app的簽名權限
3.7 其他有用的api
4、為什么設備管理器會有這么強悍的功能?他是怎么實現的?
4、github路徑