Как получить Android: значения configChanges из класса ActivityInfo - PullRequest
0 голосов
/ 02 мая 2018

Я хотел бы получить информацию о действиях (например, configchanges, resizemode, если поддерживается картинка в картинке) всех пакетов, имеющихся на устройстве.

Я могу получить информацию о деятельности, используя PackageManager с флагом GET_ACTIVITIES. С этим я могу получить значение configChanges используя ActivityInfo.configChanges.

Однако значение возвращает случайное значение int, если в android:configChanges установлено * несколько значений конфигурации.

Например:

если установлены значения ниже

андроида: configChanges = "uiMode | smallestScreenSize | локаль | ColorMode | плотность"

Получение значения конфигурации с использованием кода ниже

PackageInfo packageInfo = mPackageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);

ActivityInfo activityInfo[] = packageInfo.activities;

if(activityInfo!=null) {
    for(ActivityInfo activity : activityInfo) {
      int configChange = activity.configChanges;
    }
}

Я получаю activity.configChanges значение как 23047

Что обозначает 23047, как мне его декодировать, чтобы получить значения конфигурации, установленные в AndroidManifest.xml

В дополнение к этому мы можем получить activity.resizeMode. Я понимаю, что это @hide API. Я вижу это значение в режиме отладки в Android Studio.

Любые подсказки / помощь по вышеуказанному будут действительно полезны.

1 Ответ

0 голосов
/ 02 мая 2018

configChanges - битовая маска.

Чтобы проверить, установлен ли данный бит, вам просто нужно использовать соответствующий битовый оператор .

Например, чтобы проверить, установлена ​​ли uiMode, вы можете сделать что-то вроде этого:

int configChanges = activityInfo.configChanges;

if ((configChanges & ActivityInfo.CONFIG_UI_MODE) == ActivityInfo.CONFIG_UI_MODE) {
    // uiMode is set
} else {
    // uiMode is not set
}

Определение метода может упростить задачу:

public boolean isConfigSet(int configMask, int configToCheck) {
    return (configMask & configToCheck) == configToCheck;
}

И вы бы назвали это так:

int configChanges = activityInfo.configChanges;

boolean uiModeSet = isConfigSet(configChanges, ActivityInfo.CONFIG_UI_MODE);
boolean colorModeSet = isConfigSet(configChanges, ActivityInfo.CONFIG_COLOR_MODE);
// ...

В дополнение к этому мы можем получить activity.resizeMode. Я понимаю, что это @hide API.

Надежно, нет. Возможно, вы сможете получить к нему доступ через API отражения, хотя Google недавно опубликовал сообщение в блоге , в котором недавно было указано следующее:

Начиная с следующей версии Android, некоторые не-SDK методы и поля будут ограничены, так что вы не можете получить к ним доступ - либо напрямую, через отражение или JNI.

(доступ к скрытым полям через отражение в любом случае настоятельно не рекомендуется)

...