Сбой при использовании CompanionDeviceManager

#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. Я только что обновил ответ, включив в него обходной путь, который я использую.