背景
需要實現(xiàn)開機(jī)PIN密碼自動填充的功能,由于PIN輸入控件是一個自定義View com.android.keyguard.PasswordTextView extends View。在使用輔助功能AccessibilityService時,無法通過類似EditText一樣直接,將密碼填充進(jìn)去。只能通過模擬按鍵點擊。然后默認(rèn)下按鈕點擊輸入時密碼數(shù)字有一瞬間是明文顯示的,存在泄漏的風(fēng)險。
探索
為什么要采用 AccessibilityService
PIN 密碼的輸入為什么非得采用復(fù)雜的AccessibilityService來實現(xiàn)呢?
由于PIN涉及到操作系統(tǒng)與SIM卡的通信,在官方設(shè)計中屬于極度危險的操作,在應(yīng)用層由于權(quán)限的問題,被各種攔截掉了。
即,純代碼層面的實現(xiàn),包括反射等路子都被禁掉了。
java.lang.SecurityException: Neither user 10141 nor current process has android.permission.MODIFY_PHONE_STATE.
這就是結(jié)果。此路不通。
故,要么讓你的應(yīng)用成為系統(tǒng)應(yīng)用獲取到相應(yīng)的權(quán)限,要么放棄吧。
確定采用 AccessibilityService,密碼如何防止泄露?
其實很簡單,只是認(rèn)知的問題。在密碼輸入時,那個瞬間的明文展示,其實是一個可設(shè)置的功能。即我們可以同設(shè)置項去關(guān)閉。
小米系統(tǒng)路徑:
設(shè)置 -> 系統(tǒng)安全 -> 顯示密碼 -> 選擇開關(guān)即可
當(dāng)選擇關(guān)閉之后,再輸入密碼時,就沒有那個瞬間明文顯示的問題了。
那么問題來了,如何代碼控制呢?
代碼控制是否顯示密碼
大多數(shù)系統(tǒng)設(shè)置項,都可以通過代碼來操作。
show you the code !??!
/**
* 1:ON;0:OFF
*/
fun Context.setModeTextShowPassword(mode: Int) {
try {
Settings.System.putInt(contentResolver, Settings.System.TEXT_SHOW_PASSWORD, mode)
} catch (e: Exception) {
e.printStackTrace()
}
}
/**
* 1:ON;0:OFF
*/
fun Context.getModeTextShowPassword(): Int {
return Settings.System.getInt(contentResolver, Settings.System.TEXT_SHOW_PASSWORD, 0)
}
如上代碼,即可控制是否顯示密碼。