為使用者提供登入提示

使用者尚未儲存時,擷取使用者憑證的要求可能會失敗 或使用者尚未註冊您的應用程式時。在以下 此時,請使用 Credentials API 擷取登入提示,例如 使用者名稱和電子郵件地址請根據這些提示預先填入應用程式的登入程序 加快應用程式的新手上路流程

在 Android 6.0 (Marshmallow) 以上版本中,應用程式不需要提出要求 存取任何裝置或執行階段權限,擷取登入提示 Credentials API。

事前準備

設定 Android Studio 專案

擷取登入提示

如要擷取登入提示,請先按照 建立HintRequest 物件。然後,將 HintRequest 物件傳遞至 CredentialsClient.getHintPickerIntent() 取得意圖提示使用者選擇電子郵件地址的意圖。最後,請在 使用 startIntentSenderForResult() 建立意圖

HintRequest hintRequest = new HintRequest.Builder()
        .setHintPickerConfig(new CredentialPickerConfig.Builder()
                .setShowCancelButton(true)
                .build())
        .setEmailAddressIdentifierSupported(true)
        .setAccountTypes(IdentityProviders.GOOGLE)
        .build();

PendingIntent intent = mCredentialsClient.getHintPickerIntent(hintRequest);
try {
    startIntentSenderForResult(intent.getIntentSender(), RC_HINT, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
    Log.e(TAG, "Could not start hint picker Intent", e);
}

Smart Lock 登入提示選擇工具

系統會提示使用者選擇要使用的電子郵件地址。

接著,在活動的 onActivityResult() 方法中,從 Credential.EXTRA_KEY 地塊、檢查使用者是否位於使用者資料庫 ,並根據憑證提示啟動適當的活動。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RC_HINT) {
        if (resultCode == RESULT_OK) {
            Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
            Intent intent;
            // Check for the user ID in your user database.
            if (userDatabaseContains(credential.getId())) {
                intent = new Intent(this, SignInActivity.class);
            } else {
                intent = new Intent(this, SignUpNewUserActivity.class);
            }
            intent.putExtra("com.mycompany.myapp.SIGNIN_HINTS", credential);
            startActivity(intent);
        } else {
            Log.e(TAG, "Hint Read: NOT OK");
            Toast.makeText(this, "Hint Read Failed", Toast.LENGTH_SHORT).show();
        }
    }

    ...

}

預先填入登入表單

如果使用者位於您的使用者資料庫中,而且您已經啟動應用程式的登入程序 您可以 (選用) 檢查 Credential 物件是否包含 ID 產生下一個符記若是如此,您可以使用 ID 權杖登入使用者。 不必要求使用者輸入密碼

如果 Credential 物件沒有 ID 權杖 (或是您不想使用) ID 權杖),請在登入欄位預先填入您新增至 意圖。

public class SignInActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        Credential credential = intent.getParcelableExtra("com.mycompany.myapp.SIGNIN_HINTS");

        // Pre-fill ID field
        mUsernameView.setText(credential.getId());

        ...
    }

    ...
}

預先填入註冊表單

如果使用者不在您的使用者資料庫中,而且您已經啟動應用程式的註冊作業 活動,請在註冊欄位中預先填入您已新增的登入提示 意圖。

public class SignUpNewUserActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        Credential credential = intent.getParcelableExtra("com.mycompany.myapp.SIGNIN_HINTS");

        // Pre-fill sign-up fields
        mUsernameView.setText(credential.getId());
        mDisplaynameView.setText(credential.getName()); // Might be null.

        ...
    }

    ...
}

您也可以檢查 Credential 物件是否包含 ID 權杖 通過驗證的電子郵件地址若是如此,您可以略過應用程式的電子郵件驗證步驟。 因為此電子郵件地址已通過 Google 驗證