Android 新增API Autofill

Autofill framework
顧名思義:
當用戶交互觸發自動填充請求時,Android系統會在客戶端應用程序中創建屏幕的分層表示(稱爲view結構)。view結構包含可在每個節點中使用的自動填充類型以及節點的當前值等信息。Android系統將view結構添加到自動填充請求,並將其發送到嘗試完成請求的自動填充服務。自動填充框架定義了用於保存用戶數據的工作流程; 如果視圖結構準確描述了客戶端應用程序中的屏幕,則自動填充服務可以更好地滿足請求。此外,您可以提供專門創建的其他信息,以幫助自動填充服務確定如何完成請求
一、
什麼是Autofill Framework
1.它是一個服務端和客戶端協同工作的基礎結構,自動填寫框架主要針對與某些應用的用戶數據自動填寫view,和管理應用之間的一種通信機制;
2.在瞭解這兩個類之前先看一下關於自動填充的一些相關信息,自動填寫框架必須是在(API 26)也就是android8.0以後版本及更高版本纔可以使用;
3. 便於用戶在使用登錄多個賬戶,或登錄密碼,郵箱,驗證碼等,減少用戶使用過程中重新輸入信息和錯別字的修改;
4.用戶可以自行選擇多種自動填寫服務(過程類似於選擇輸入法)。默認情況下,Google服務支持自動填寫,不過用戶可以自行添加任何三方自動填寫app,操作方法如下:
Setting->system->languages&input->advanced->autofill services

Autofill services:服務端,用來保存和存儲多個應用程序使用中的用戶信息。
Autofill clients:客戶端,指應用程序需要填寫和保存用戶數據的信息;
Android system:系統,主要是指如何使用AutofillService和AutofillManager與Clients協同工作的操作系統;
有關自動填充的更多信息,詳情可參考鏈接:
https://developer.android.com/guide/topics/text/autofill

二、如何構建autiofill service
1.首先是要清單文件聲明權限,“android.permission.BIND_AUTOFILL_SERVICE”,在res文件定義xml包, 生成一個service_configuration.xml資源用來指定用戶允許用戶配置service的Activity;

AndroidManifest.xm

<service
   android:name=".MyAutofillService"
    android:label="My Autofill Service"
    android:permission="android.permission.BIND_AUTOFILL_SERVICE">
    <intent-filter>
 <action        
       android:name="android.service.autofill.AutofillService" />
    </intent-filter>
    <meta-data
        android:name="android.autofill"
        android:resource="@xml/service_configuration" />
</service>

service_configuration.xml

<autofill-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:settingsActivity="com.example.android.SettingsActivity" />

2.這裏要注意的是"android.service.autofill.AutofillService"這個action,在AutofillService中onBind方法中有一個判斷,如過action匹配則將通信通道返回給服務 ,反之客戶端將無法綁定到服務,如圖1,下滑線的server apk則不會出現;

public static final String SERVICE_INTERFACE ="android.service.autofill.AutofillService";
...
@Override
public final IBinder onBind(Intent intent) {
if (SERVICE_INTERFACE.equals(intent.getAction())) {
        return mInterface.asBinder();
    }
    Log.w(TAG, "Tried to bind to wrong intent: " + intent);
    return null;
}

圖 1;
在這裏插入圖片描述

3.在用戶啓用BIND_AUTOFILL_SERVICE權限後,可以通過AutofillManager調hasEnabledAutofillServices()方法來進行驗證,是否啓動當前服務,如果沒有啓動可通過intent發生一個ACTION_REQUEST_SET_AUTOFILL_SERVICE啓動setting中autofill的Activity來選擇更改自動填充服務如圖2,如調用者和包匹配,intent則會返回一個值;

public class MainActivity extends Activity {
@Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
       ...
     //通過SystemService獲取AutofillManager;
  mAutofillManager = getSystemService(AutofillManager.class);
     ...
     }
 public void startSettingAutofillActivity(){
     if (mAutofillManager != null && !mAutofillManager.hasEnabledAutofillServices()) {
      //通過此參數可直接打開settingActivity自動填充頁面;
      Intent intent = new Intent(Settings.ACTION_REQUEST_SET_AUTOFILL_SERVICE);
      intent.setData(Uri.parse("package:com.example.android.autofill.service"));
      startActivityForResult(intent, 1);
       } else {
      //如果應用調用此API的,已啓用自動填充服務將被禁用。
     mAutofillManager.disableAutofillServices();
      }
   }
}

圖2:
在這裏插入圖片描述

4.自定義Autofillservice,需要重新兩個方法onFillRequest()和onSaveRequest(),這兩個方法是AutofillService中的回調方法,在什麼事後回調, onFillRequest()點擊自動填充執行填充時,切當前用戶沒有記錄時調用該方法; onSaveRequest()請求服務保存內容時調用該方法;

public class MyAutofillService extends AutofillService{
    @Override
    public void onFillRequest(@NonNull FillRequest request, @NonNull CancellationSignal cancellationSignal, @NonNull FillCallback callback) {
    }
    @Override
    public void onSaveRequest(@NonNull SaveRequest request, @NonNull SaveCallback callback) {
    }
    
}

5.在輸入用戶名或密碼點擊登錄或finish當前Activity時,acitvity處於onStop狀態時,此時會調起onActivityFinishing最終調起showSaveUi,並創建SaveUi對象,其SaveUI內部就是創建了一個Dialog,在顯示dialog的執行過程中,會把自動填充的數據採用ArrayMap<Id,value>進行封裝,最後通過onSave()方法對其進行保存,如圖3;

圖3:
在這裏插入圖片描述

如何構建autofill service https://blog.csdn.net/xiao_yuanjl/article/details/85098706

關於AutofillService和AutofillManager詳細使用,可先看如下兩個鏈接,不過需要翻牆纔可以:
https://developer.android.com/reference/android/service/autofill/AutofillService
https://developer.android.com/reference/android/view/autofill/AutofillManager#public-methods

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章