標籤:
Android Device Administration 裝置管理員——鎖屏的實現
最近研究了一下安全這一塊的內容,當然,我是比較水的,所以也拿不出什麼好知識點,但是有一些冷門的東西我還是可以聊聊的,就拿這個鎖屏來說吧,我們現在市面上有一些一鍵鎖屏的軟體
我們可以看到,是數不勝數的,所以,其實他一開始使用的時候,都需要請求裝置管理員
我們可以看到,只有當我們啟用的時候,我們才可以使用它,那麼,他到底是什麼東西呢?其實,當我們啟用之後,我們可以在我們手機的設定——安全——裝置管理員裡面看到他的所有資訊
我們帶著這個疑問,開啟我們的android api指南看看
- 地址:http://www.android-doc.com/guide/topics/admin/device-admin.html
一.裝置管理
Android 2.2引入了公司專屬應用程式程式提供支援 Android裝置管理API。 裝置管理API提供了裝置 系統級管理功能。 這些api允許您建立安全性敏感的應用程式用於企業設定,例如, 內建Android電子郵件應用程式利用了新的api來改善 交換的支援。 通過電子郵件應用程式中,管理員可以交換 執行密碼原則——包括字母數字密碼或數字 針,在裝置管理員也可以遠程擦除(即 恢複工廠預設值丟失或被盜的手機。 使用者可以交換同步 他們的電子郵件和行事曆資料。
二.裝置管理API概述
下面的例子類型的應用程式,可以使用裝置管理API:
- 電子郵件用戶端。
- 遠程擦除資料的安全應用程式
- 裝置管理服務和應用程式。
三.它是如何工作的
你使用的裝置管理API編寫裝置管理應用程式的使用者 安裝在他們的裝置上。 裝置管理應用程式執行所需的政策。
系統管理員寫一個裝置管理應用程式執行 遠程/本地裝置安全性原則。 這些政策可能是硬式編碼 應用程式或應用程式可以動態地從第三方擷取政策伺服器。
應用程式安裝在使用者的裝置上。 但是Android確實目前沒有一個自動設定解決方案。 系統管理員可能的一些方法分發應用程式使用者如下:
- Google play
- 其他商店
- 其他方式,比如郵件或者網站
系統提示使用者啟用裝置管理應用程式, 當發生這種情況取決於應用程式是如何?的。
一旦使用者啟用裝置管理應用程式,它們是其政策。遵守這些政策通常帶來好處,比如 對敏感系統和資料的訪問。
如果使用者不啟用裝置管理應用程式,它仍然是在裝置上,但是在一個不活躍的狀態。 使用者將不受其政策,他們將針對積極心態相反沒有得到任何應用程式的例子,他們可能無法同步資料。
如果使用者未能遵守政策(例如,如果一個使用者佈建一個 密碼,違反了準則),它是由應用程式來決定 如何處理這個問題。 然而,這通常會導致使用者不 能同步資料。
如果一個裝置試圖串連到伺服器,需要政策 在裝置管理API,支援串連不會 被允許。 裝置管理API目前並不允許部分 供應。 換句話說,如果一個裝置(例如,一個遺留裝置) 不支援所有的既定政策,允許沒有辦法 裝置串連。
如果一個裝置包含多個管理員啟用應用程式,嚴格的政策 執行。 沒有辦法目標特定的管理 應用程式。
卸載現有裝置管理應用程式中,使用者需要 先登出程式作為管理員。
翻譯有點蹩腳哈,但是大概的意思就是你啟用之後他就是一個政策,但是你不啟用,也是可以的,只是出於靜止狀態,卸載這個應用之前你就需要先登出裝置管理許可權
那我們應該怎麼做呢?他的政策比較多,我們大致的看一下
四.一鍵鎖屏
OK,我們說了這麼多概念,倒不如直接用代碼說明
其實官方文檔說的十分的詳細,首先我們要定義一個Receiver讓他繼承DeviceAdminReceiver,我們暫時不是實現它
package com.lgl.lockone;import android.app.admin.DeviceAdminReceiver;/** * 鎖屏 * Created by LGL on 2016/7/24. */public class LockReceiver extends DeviceAdminReceiver{}
然後我們需要定義資訊清單檔
<receiver android:name=".LockReceiver" android:label="@string/sample_device_admin" android:description="@string/sample_device_admin_description" 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>
這裡有必要要說一下了,首先是label,說標題,這個應該大家都知道,然後是description描述,當你啟用裝置的時候就會去請求,你就可以看到了,最後要綁定一個許可權檔案,我們在res下new一個xml檔案夾,建立一個device_admin_sample
<?xml version="1.0" encoding="utf-8"?><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>
OK,這些做完了之後我們先去最簡單的實現一下鎖屏,需要用到DevicePolicyManager
package com.lgl.lockone;import android.app.admin.DevicePolicyManager;import android.content.Context;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity { private Button btnLock; private DevicePolicyManager mDPM; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //裝置政策管理器 mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); btnLock = (Button) findViewById(R.id.btnLock); btnLock.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //鎖屏 mDPM.lockNow(); } }); }}
其實這裡就一個按鈕,然後去lockNow請求鎖屏,但是你會發現,他報錯了,提示是沒有許可權,這個許可權可以不是使用者的許可權,我們去裝置管理員裡面看一下
這裡,就有我們的應用了,上面就是我們在清單裡面定義的標題和描述了,我們勾選上,再去實現鎖屏,你會發現就可以了,這就是需要我們手動去開啟了,但是使用者大多數是不會知道這回事的,所以我們一啟動程式我們應該就去啟用,文檔上其實也已經寫了,我們來看
ComponentName mDeviceAdminSample = new ComponentName(this, LockReceiver.class); Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "我是不是很帥"); startActivity(intent);
然後我們再來看下效果
而且我們可以更改鎖屏密碼
//重設密碼 mDPM.resetPassword("12345678", 0);
如果傳空串那就說明不要密碼,我們可以再次運行一下
OK,我們來看下首頁的邏輯吧
package com.lgl.lockone;import android.app.admin.DevicePolicyManager;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity { private Button btnLock; private DevicePolicyManager mDPM; private ComponentName mDeviceAdminSample; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDeviceAdminSample = new ComponentName(this, LockReceiver.class); //裝置政策管理器 mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); btnLock = (Button) findViewById(R.id.btnLock); btnLock.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mDPM.isAdminActive(mDeviceAdminSample)) { //鎖屏 mDPM.lockNow(); //重設密碼 mDPM.resetPassword("123456", 0); } else { Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "我是不是很帥"); startActivity(intent); } } }); }}
基本上沒什麼代碼,如果大家有興趣可以加群
通往Android的神奇之旅:555974449Demo下載:正在上傳
Android Device Administration 裝置管理員——一鍵鎖屏的實現