
在Android 8.0中加入了Autofill framework,也就是自動(dòng)填充框架,目的在于簡化了登錄和信用卡表單之類表單的填寫工作。如果一個(gè)應(yīng)用支持自動(dòng)填充,系統(tǒng)從用戶的Google賬戶保存的自動(dòng)填充信息中選取相應(yīng)的內(nèi)容來填充當(dāng)前輸入框,比如下圖中,一個(gè)登錄頁面的手機(jī)號(hào)碼輸入欄,自動(dòng)填充的推薦內(nèi)容則是當(dāng)前用戶的手機(jī)號(hào)碼。
這個(gè)功能也不是什么新的亮點(diǎn),用過Chrome瀏覽器的人對自動(dòng)填充功能肯定有所體驗(yàn),這次Google把它搬到了手機(jī)上,目的自然是想打通各個(gè)平臺(tái)。但是同時(shí)問題也來了,在某些頁面我并不是很想使用自動(dòng)填充功能,因?yàn)樘畛涞臄?shù)據(jù)實(shí)在是不怎么友好,比如對于一個(gè)簡單的搜索框,系統(tǒng)給出的自動(dòng)填充建議竟然是機(jī)主的姓名。再者就是有些敏感數(shù)據(jù)并不想保存到自動(dòng)填充的表單里面,所以筆者根據(jù)參考官方文檔和一些博文整理了本篇文章。
作為一個(gè)開發(fā)者,如何來控制自動(dòng)填充功能呢?在Android O Developer Preview 3中g(shù)oogle提供了一些解決辦法,即從sdk26開始,所有的視圖中新增了一個(gè)android:importantForAutofill的屬性,以及相應(yīng)的一個(gè)方法setImportantForAutofill()來控制自動(dòng)填充功能,具體的細(xì)節(jié)不細(xì)說,可參考官方文檔,這里只簡單說一下如何在代碼里控制自動(dòng)填充功能。
通過在 layout 文件中給控件設(shè)置
android:importantForAutofill="no"或在代碼中調(diào)用View的setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO)方法。-
通過在 activity 的
onCreate()方法中加入如下代碼:getWindow()
.getDecorView()
.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS);
```
在這種情況下,這些控件的數(shù)據(jù)也不會(huì)提供給自動(dòng)填充服務(wù),不會(huì)被記錄。對于一個(gè)視圖容器來說,如果設(shè)置了noExcludeDescendants或者IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS,也就意味著不僅是該容器自身還是它的所有子視圖,都會(huì)受到相關(guān)影響。
對于某些安全性要求較高或者某些特殊的頁面,自動(dòng)填充不再是一個(gè)優(yōu)勢,反而帶來影響的時(shí)候,我們可以用上面的兩個(gè)方式來禁止自動(dòng)填充功能。
對于某些系統(tǒng)版本,比如 Android O Preview 2中,以上兩個(gè)方式不會(huì)生效。這時(shí)候就可以用AutofillManager先檢查一下自動(dòng)填充是否開啟,如果開啟了,采取回避行動(dòng)。
if (getSystemService(android.view.autofill.AutofillManager.class).isEnabled()) {
Toast.makeText(this, "Ick!", Toast.LENGTH_LONG).show();
finish();
}
本作品由TedXiong采用知識(shí)共享署名-非商業(yè)性使用-相同方式共享 4.0 國際許可協(xié)議進(jìn)行許可。
