當使用者尚未儲存憑證,或使用者尚未註冊應用程式時,要求擷取使用者憑證可能會失敗。在這種情況下,請使用 Credentials API 擷取登入提示 (例如使用者名稱和電子郵件地址)。您可以根據這些提示預先填入應用程式的登入和註冊表單,進而加快應用程式的新手上路流程。
在 Android 6.0 (Marshmallow) 以上版本中,應用程式無須要求任何裝置或執行階段權限,即可使用 Credentials API 擷取登入提示。
事前準備
擷取登入提示
如要擷取登入提示,請先建立 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);
}
系統會提示使用者選擇要使用的電子郵件地址。
接著,在活動的 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 驗證。