#android #android-context
#Android #android-контекст
Вопрос:
Я пытаюсь использовать CompanionDeviceManager в соответствии с приведенным здесь руководством.
При попытке вызвать associate в экземпляре я получаю следующее исключение:
java.lang.ClassCastException: android.app.ContextImpl cannot be cast to android.app.Activity
Я получаю экземпляр CompanionDeviceManager в activity, через getSystemService(CompanionDeviceManager.class)
, я пытался переместить это, даже в onCreate, но изменений не было, всегда одно и то же исключение. Я даже несколько раз пытался переустановить приложение, но безуспешно. Как я могу это исправить?
Ответ №1:
В моем случае я столкнулся с той же ошибкой и обнаружил, что это связано с тем, что я менял контекст в attachBaseContext (в целях динамического изменения языка). Я использовал:
super.attachBaseContext(newBase.createConfigurationContext(config))
Похоже, что CompanionDeviceManager требует, чтобы контекст, который его создает, был действием (возможно, потому, что он создает диалоговое окно).
Я бы дважды проверил ваш код, используя activity, который является прямым потомком AppCompatActivity, и тогда он должен работать. Затем вы можете попытаться найти что-нибудь, что могло бы изменить контекст на что-то другое, кроме самого действия.
Если вам нужно изменить язык, используйте что-то вроде этого:
override fun attachBaseContext(newBase: Context) {
val res = newBase.resources
val config = res.configuration
val languageSetting = instance.getLocale(newBase) //get the locale you want from preferences etc.
if (Build.VERSION.SDK_INT >= 17) {
val locale = if (languageSetting == "")
Locale.getDefault()
else
Locale(languageSetting)
config.setLocale(locale)
if(Build.VERSION.SDK_INT > 24) {
//Using createNewConfigurationContext will cause CompanionDeviceManager to crash
applyOverrideConfiguration(config)
super.attachBaseContext(newBase)
}else {
super.attachBaseContext(newBase.createConfigurationContext(config))
}
} else {
super.attachBaseContext(newBase)
}
}
Комментарии:
1. вы были правы, это действительно так, однако мне нужно изменить язык и, следовательно, добавить новый контекст, как я могу обойти это?
2. Я только что обновил ответ, включив в него обходной путь, который я использую.