Как использовать API смарт-блокировки в моем приложении для разблокировки режима patter?

Я использую Android 5.0. Версия предоставляет функцию SmartLock, которая позволяет разблокировать пароль/шаблон, подключив его к доверенному устройству. У меня есть устройство с низкой энергией Bluetooth (BLE), которое зарегистрировано как доверенное устройство. Я хочу использовать BLE для разблокировки (режим шаблона) телефона. Он разблокирует телефон, когда BLE и телефон подключены, и данные доступны в событии

if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) 
// Calling unlock by the SmartLock API

Если кто-нибудь, кто работал с SmartLock, пожалуйста, дайте мне несколько советов, чтобы сделать это? Я не нашел никакого API-интерфейса SmartLock для этого. введите описание изображения здесь

Спасибо всем

Ответ 1

Для SmartLock нет внешнего API как такового. Вы можете проверить Google Документы для справки.

Вы можете проверить этот образец на GitHub и здесь вы найдете руководство по интеграции API смарт-блокировки в своем приложении.

Ответ 2

Это может быть немного сложнее, но Google уже предоставил Docs об этом использовании.

Чтобы запросить хранимые учетные данные, вы должны создать экземпляр GoogleApiClient, настроенный для доступа к API учетных данных.

mCredentialsApiClient = new GoogleApiClient.Builder(this)
    .addConnectionCallbacks(this)
    .enableAutoManage(this, this)
    .addApi(Auth.CREDENTIALS_API)
    .build();

Объект CredentialRequest указывает системы входа, из которых вы хотите запросить учетные данные. Постройте a CredentialRequest с помощью метода setPasswordLoginSupported для входа на основе пароля и метода setAccountTypes() для федеративных служб входа в систему, таких как вход в систему Google.

mCredentialRequest = new CredentialRequest.Builder()
    .setPasswordLoginSupported(true)
    .setAccountTypes(IdentityProviders.GOOGLE, IdentityProviders.TWITTER)
    .build();

После того, как вы создали объекты GoogleApiClient и CredentialRequest, передайте их методу CredentialsApi.request(), чтобы запросить учетные данные, сохраненные для вашего приложения.

Auth.CredentialsApi.request(mCredentialsClient, mCredentialRequest).setResultCallback(
    new ResultCallback<CredentialRequestResult>() {
        @Override
        public void onResult(CredentialRequestResult credentialRequestResult) {
            if (credentialRequestResult.getStatus().isSuccess()) {
                // See "Handle successful credential requests"
                onCredentialRetrieved(credentialRequestResult.getCredential());
            } else {
                // See "Handle unsuccessful and incomplete credential requests"
                resolveResult(credentialRequestResult.getStatus());
            }
        }
    });

При успешном запросе учетных данных используйте полученный объект Credential для завершения входа пользователя в ваше приложение. Используйте метод getAccountType(), чтобы определить тип полученных учетных данных, затем выполните соответствующий процесс входа.

private void onCredentialRetrieved(Credential credential) {
    String accountType = credential.getAccountType();
    if (accountType == null) {
        // Sign the user in with information from the Credential.
        signInWithPassword(credential.getId(), credential.getPassword());
    } else if (accountType.equals(IdentityProviders.GOOGLE)) {
        // The user has previously signed in with Google Sign-In. Silently
        // sign in the user with the same ID.
        // See https://developers.google.com/identity/sign-in/android/
        GoogleSignInOptions gso =
                new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                        .requestEmail()
                        .build();
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this, this)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .setAccountName(credential.getId())
                .build();
        OptionalPendingResult<GoogleSignInResult> opr =
                Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient);
        // ...
    }
}

Ответ 3

Я не думаю, что есть API SmartLock. Как сказал Правин в комментариях, смарт-блокировка автоматически отключит шаблон при подключении устройства.

Я не пробовал это, но как только шаблон отключен, вы можете обойти экран блокировки со следующим (от этого ответа):

KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE);
KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
lock.disableKeyguard();

Вам нужно будет добавить разрешение на манифест:

<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>