Cung cấp gợi ý đăng nhập cho người dùng

Các yêu cầu truy xuất thông tin xác thực của người dùng có thể không thành công khi người dùng chưa lưu thông tin xác thực hoặc khi người dùng chưa đăng ký ứng dụng. Trong những tình huống này, hãy sử dụng API thông tin xác thực để truy xuất gợi ý đăng nhập, chẳng hạn như tên và địa chỉ email của người dùng. Hãy sử dụng các gợi ý này để điền sẵn biểu mẫu đăng nhập và đăng ký của ứng dụng, giúp đẩy nhanh quá trình làm quen của ứng dụng.

Trên Android 6.0 (Marshmallow) trở lên, ứng dụng của bạn không cần yêu cầu quyền trên thiết bị hoặc quyền khi bắt đầu chạy để truy xuất gợi ý đăng nhập bằng API thông tin xác thực.

Trước khi bắt đầu

Định cấu hình dự án Android Studio.

Truy xuất gợi ý đăng nhập

Để truy xuất gợi ý đăng nhập, trước tiên, hãy định cấu hình hộp thoại bộ chọn gợi ý bằng cách tạo đối tượng HintRequest. Sau đó, hãy truyền đối tượng HintRequest đến CredentialsClient.getHintPickerIntent() để lấy ý định nhắc người dùng chọn địa chỉ email. Cuối cùng, hãy bắt đầu ý định bằng 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);
}

Trình chọn gợi ý đăng nhập vào Smart Lock

Người dùng sẽ được nhắc chọn một địa chỉ email để sử dụng.

Sau đó, trong phương thức onActivityResult() của hoạt động, hãy truy xuất gợi ý từ gói Credential.EXTRA_KEY, kiểm tra xem người dùng có ở trong cơ sở dữ liệu người dùng của bạn hay không và bắt đầu hoạt động thích hợp bằng gợi ý thông tin xác thực.

@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();
        }
    }

    ...

}

Điền sẵn biểu mẫu đăng nhập

Nếu người dùng nằm trong cơ sở dữ liệu người dùng của bạn và bạn đã bắt đầu hoạt động đăng nhập của ứng dụng, thì bạn có thể (không bắt buộc) kiểm tra xem đối tượng Credential có chứa mã thông báo mã nhận dạng hay không. Trong trường hợp đó, bạn có thể đăng nhập người dùng bằng mã nhận dạng mà không cần yêu cầu người dùng nhập mật khẩu.

Nếu đối tượng Credential không chứa mã thông báo nhận dạng (hoặc bạn không muốn sử dụng mã nhận dạng), hãy điền sẵn các trường đăng nhập bằng gợi ý mà bạn đã thêm vào ý định.

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());

        ...
    }

    ...
}

Điền sẵn biểu mẫu đăng ký

Nếu người dùng không có trong cơ sở dữ liệu người dùng và bạn đã bắt đầu hoạt động đăng ký của ứng dụng, hãy điền sẵn các trường đăng ký bằng gợi ý đăng nhập mà bạn đã thêm vào ý định.

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.

        ...
    }

    ...
}

Nếu muốn, bạn cũng có thể kiểm tra xem đối tượng Credential có chứa mã thông báo nhận dạng có địa chỉ email đã xác minh hay không. Nếu vậy, bạn có thể bỏ qua bước xác minh email của ứng dụng, vì địa chỉ email đã được Google xác minh.