Использование внутренних классов Android

Я хочу использовать внутренний класс Android, com.android.internal.widget.LockPatternUtils.

Я искал примеры, и я получил это:

LockPatternUtils lpu = new LockPatternUtils(this.getContentResolver());

Однако я не могу импортировать, автоимпорт не появляется и вручную

import com.android.internal.widget.LockPatternUtils 

не работает.

Как это обрабатывается? Я думаю, что было что-то о создании интерфейса, но не уверен в этом

РЕДАКТИРОВАТЬ: я получил это:

  boolean patternLocked = android.provider.Settings.System.getInt(
     getContentResolver(),Settings.System.LOCK_PATTERN_ENABLED, 0)==1;

Это работает для блокировки шаблона, но я не могу знать о блокировке PIN-кодом или паролем.


person JesusS    schedule 05.07.2013    source источник


Ответы (3)


Как это обрабатывается?

Эти классы доступны только в составе полных сборок встроенного ПО, а не в приложениях Android SDK.

person CommonsWare    schedule 05.07.2013
comment
Класс «Телефония» также является внутренним, но к нему можно получить доступ в стороннем приложении. Разве здесь нет такого решения? - person JesusS; 05.07.2013
comment
@JesusS: Класс телефонии тоже является внутренним, но к нему можно получить доступ в стороннем приложении - ненадежно. Все, что является внутренним, может и будет изменено (или даже удалено) производителями устройств и моддерами ПЗУ. - person CommonsWare; 05.07.2013

Используйте отражение для доступа к внутреннему методу Android getActivePasswordQuality (строка 350 документа LockPatternUtils.java) и сравните возвращаемый им int с int для любого из Константы DevicePolicyManager:

protected boolean isSecure() {

    String LOCK_PATTERN_UTILS = "com.android.internal.widget.LockPatternUtils";

    try {
        Class<?> lockPatternUtilsClass = Class.forName(LOCK_PATTERN_UTILS);
        Object lockPatternUtils = lockPatternUtilsClass.getConstructor(Context.class).newInstance(this);
        Method method = lockPatternUtilsClass.getMethod("getActivePasswordQuality");
        int lockProtectionLevel = Integer.valueOf(String.valueOf(method.invoke(lockPatternUtils)));

        // Then check if lockProtectionLevel == DevicePolicyManager.TheConstantForWhicheverLevelOfProtectionYouWantToEnforce, and return true if the check passes, false if it fails
    }
    catch (Exception ex) {
        ex.printStackTrace();
    }

    return false;
}
person esme_louise    schedule 15.08.2014
comment
getActivePasswordQuality был изменен в API 23 и теперь требует аргумента int (идентификатор пользователя). Есть ли способ определить идентификатор текущего пользователя без разрешения MANAGE_USERS? - person friederbluemle; 12.10.2015

Вы не можете использовать внутренние классы Android, они не поставляются с общедоступным SDK.

Вы можете создать свой собственный SDK, раскрывая их более или менее, как здесь and-internal-apis-available">Как создать Android SDK с доступными скрытыми и внутренними API?

Это не рекомендуется, потому что у вас не будет никаких гарантий.

person Alexander Kulyakhtin    schedule 05.07.2013