Ошибки в Android 8.0: ориентация и доступ к контактам
Быстрый ответ
Для решения проблемы с java.lang.IllegalStateException
, связанной с прозрачными активностями, им стоит назначить ориентацию "unspecified"
. Для этого необходимо обновить файл AndroidManifest.xml
:
<activity android:name=".YourTransparentActivity"
android:screenOrientation="unspecified">
<!-- Дополнительные параметры -->
</activity>
Этот метод поможет избежать конфликтов, связанных с ориентацией экрана в неполноэкранных активностях.
Изменение ориентации в Oreo
С релизом Android Oreo были внедрены новые ограничения, касающиеся активностей и их ориентации на экране. Так, активности, которые не являются полноэкранными и непрозрачными, теперь не могут устанавливать фиксированную ориентацию.
Настройка активностей для Oreo
Тем, кто нацеливается на поддержку Oreo, следует проверить настройки тем своих активностей на предмет полноэкранных режимов. Желательно избегать использования android:windowIsTranslucent=true
в собственных темах. Для того чтобы сделать активность непрозрачной, укажите android:windowIsTranslucent=false
и android:windowIsFloating=false
.
AsyncTask и Oreo
Появление Oreo немного осложнило работу с AsyncTask
— стоит изучить новые методы и лучшие практики для выполнения фоновых задач, введённые в обновлении.
Условное установление запрашиваемой ориентации
Если вы намерены поддерживать ранние версии Android, учтите особенности Oreo. В этом поможет следующий код:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
// Этот фрагмент кода сохраняет ваши настройки ориентации для Oreo
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Такой подход поможет избежать ошибок в новых версиях, сохраняя при этом установленную ориентацию на старых.
Роль тем в установке ориентации
Помните, что при выборе темы в Oreo значение android:theme=@style/Transparent
подходит для полноэкранных и прозрачных активностей. Если же вы планируете установить фиксированную ориентацию экрана, тогда активность должна быть непрозрачной.
Управление режимами ввода для окон
Режимы ввода могут быть искусными. Чтобы поддерживать порядок, назначьте android:windowSoftInputMode
значение stateHidden|adjustResize
.
Проверка базовой темы
Если ваша базовая тема отвечает требованиям по версиям, начиная хотя бы с Theme.AppCompat.Light.NoActionBar
, каждый сможет ощутить уют и современность.
Полноэкранные активности и требования к ориентации
Поклонники прозрачности в полноэкранном дизайне могут быть уверены, что Oreo позволяет таким активностям иметь определенную ориентацию, при условии избегания IllegalStateException
.
Визуализация
Давайте представим приложения Android в виде домов:
- Полноэкранный: Это аккуратный дом с тонированными окнами.
- Непрозрачный: Надежный дом с непрозрачной дверью.
Запрос на изменение ориентации — это как запрос дому повернуться:
- До Oreo: Вызов принят, дом открыт!
- После Oreo: Только дома с тонированными окнами и непрозрачными дверями могут выполнить такой запрос.
Нарушение правил происходит, когда дом со стеклянными или полупрозрачными элементами пытается запросить ориентацию:
💥 Бах! Только полноэкранные непрозрачные активности могут делать это.
Обход ограничений:
Приспособимся к новым правилам: Полноэкранность + непрозрачность = взрывов не будет (🔄✅)
Распространенные проблемы
При возникновении IllegalStateException
Если вы столкнулись с IllegalStateException
, вероятно, ваша активность ожидала другую тему, или она не соответствует требованиям полноэкранного режима.
Управление поворотом устройства
Хотя может быть соблазнительно указать android:screenOrientation="portrait"
, более правильным решением будет программное обработка ориентации устройства.
Приспособление к режиму многозадачности
Если вам нужно работать в режиме многозадачности, учтите, что setRequestedOrientation
может вести себя не так, как вы ожидаете. Держите активности гибкими и адаптируйтесь к естественному ритму работы.
Переход к потокам и асинхронным задачам
На курсе современной разработки подумайте о переходе от AsyncTask
к использованию Executor
, HandlerThread
или Coroutines
— это как замена старой кареты на современный автомобиль.
Полезные материалы
- Handle configuration changes | Android Developers — Подробное руководство по управлению изменениями в конфигурации Android-приложения.
- Activity | Android Developers — Класс
Activity
: все, что нужно знать разработчику. - Google Issue Tracker — Площадка для обсуждения и отчетов о проблемах, связанных с Android-активностями.
- Handling Orientation Changes in Android | by Ankit Sinhal | AndroidPub | Medium — Детальный разбор управления изменениями ориентации и связанных с ними проблем.
- core/java/android/app/Activity.java – platform/frameworks/base – Git at Google — Исходный код класса Activity на низком уровне.
- Handling Configuration Changes | CodePath Android Cliffnotes — Наглядный учебник для начинающих разработчиков Android, богатый советами по работе с изменением ориентации устройства.