Android一鍵鎖屏APP


題記:

這個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路徑


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM