23 октября 2015 г.

Изменения в Android 6, часть первая

    Эта запись - не точный перевод официальной статьи от Google: https://developer.android.com/intl/ja/about/versions/marshmallow/android-6.0-changes.html Если вы владеете английским языком на уровне, достаточным для комфортного чтения, лучше обратитесь к первоисточнику. Также мне будет полезно, если вы укажете на ошибки перевода, особенно в матчасти.

Изменения в Android 6.0: от пермишенов до выделения текста

    Условие: По тексту будет часто использоваться конструкция “Android 6.0 (API level 23)”. Её использует сам Google и, потому, использую и я. Возможно это поможет избежать ситуации, если в будущем Android 6 будет охватывать API других версий и если на одну версию API будет несколько версий Android 6.
   
Для реализации новых свойств и возможностей, Android 6.0 (API level 23) включает разнообразные изменения системы и изменение API. Этот документ освещает те из них, которые вам нужно понимать и которые затронут ваши приложения.
    Если вы ранее публиковали приложения под Android, будьте готовы, что изменения платформы заденут ваши приложения.

Запрос прав доступа во время выполнения

    Условие: термин “Runtime Permissions” переведён как «управление правами доступа во время выполнения». В обиходе говорят просто “рантайм” в значении “во время работы приложения” и “пермишен” в значении “права доступа”. То есть те запросы прав доступа, которые возникают у пользователей Андроид 6, называются “рантайм пермишены”.
   
Этот релиз привнёс новую модель прав доступа, где пользователи могут напрямую управлять правами доступа приложений, пока эти приложения запущены. Эта модель даёт пользователям понимание происходящее и контроль прав доступа, а разработчикам – улучшения процесса установки и автообновления приложений. Пользователи могут одобрять или отзывать права доступа индивидуально для каждого установленного приложения.
    В ваших приложениях, которые нацелены на Android 6.0 (API level 23) или выше, нужно убедиться, что у него есть нужные права доступа и запрашивать их по необходимости. Для определения, имеются ли у приложения нужные права доступа, нужно вызвать новый метод checkSelfPermission(). Для запроса прав доступа вызывайте метод requestPermissions(). Но даже если ваши приложения не нацелены на Android 6.0 (API level 23), вы должны тестировать их работу с новой моделью разрешений.
    Чтобы узнать детали поддержки новой модели прав доступа вашими приложениями, прочтите “Working with System Permissions”. Чтобы получить советы по оценке влияния новой модели на ваши приложения, смотрите “Permissions Best Practices”.

Doze и App Standby

    Условие: Doze и App Standby не переведены, т.к. не вижу смысла, но вообще речь идёт о глобальном режиме сна (доуз) и выявлении простаивающих приложений (апп стендбай).
    В этом релизе внедрены новые режимы оптимизации затрат энергии при бездействии устройства и приложений. Эти оптимизации затрагивают все приложения, так что будьте готовы тестировать ваши продукты с поддержкой новых режимов.
  • Doze. Когда пользователь снимает устройство с зарядки и не использует его, устройство гасит экран. Через некоторое время устройство переходит в режим Doze, которое пытается удерживать систему в состоянии сна. В этом режиме устройство иногда “просыпается” на короткий период времени и тогда приложения могут выполнить синхронизации и система может выполнить все отложенные операции.
  • App Standby. Этот режим позволяет системе выявлять неиспользуемые приложения. Система делает свои выводы на основе того, что пользователь не взаимодействовал с приложением некий период времени. Если устройство снято с зарядки, то для приложений, определённых как неиспользуемые, отключается сетевой доступ и замораживаются фоновые задачи, в т.ч. синхронизации.
    Чтобы узнать больше об изменениях, связанных с экономией заряда, смотрите “Optimizing for Doze and App Standby”.

Удаление Apache HTTP клиента

    В релизной Android 6.0 удалена поддержка клиента Apache HTTP. Если ваши приложения используют этот клиент и нацелены на Android 2.3 (API level 9) и выше, используйте вместо него класс HttpURLConnection. Этот API более действенный, потому что он снижает сетевые расходы и объём трафика через прозрачное сжатие и кеширование ответов, а также минимизирует потребление заряда. Для продолжения использования Apache HTTP API, вы должны объявить следующую зависимость в buid.gradle файле:
android {
    useLibrary 'org.apache.http.legacy'
}

BoringSSL

    Android избавляется от OpenSSL в пользу библиотеки BoringSSL. Если в своём приложении вы используете Android NDK, не линкуйте криптографические библиотеки, не являющиеся частью Android NDK API, такие как libcrypto.so и libssl.so. Эти библиотеки не предоставляют публичных API и могут изменяться и ломаться безо всякого предупреждения от версии к версии и от устройства к устройству. Дополнительно, вы сами подвергаете продукты опасности обнаружения уязвимостей в них. Если вам нужно, вместо этого модифицируйте нативный код приложений для вызова криптографический функций Java через JNI или статически линкуйте криптографические библиотеки.

Доступ к аппаратным индефикаторам

    Для лучшей защиты пользовательских данных, начиная с этого релиза из Android удалён программный доступ к аппаратным индефикаторам, если приложение использует Wi-Fi или Bluetooth API. Методы WifiInfo.getMacAddress() и BluetoothAdapter.getAddress() теперь возвращают постоянное значение “02:00:00:00:00:00”.
    Для доступа к аппаратным индефикаторам устройств внешних ближнего действия через Wi-Fi или Bluetooth сканирование, ваше приложение должно иметь права доступа ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION:
Замечание. Когда устройство, работающее под Android 6.0 (API level 23) инициирует фоновое сканирование Wi-Fi или Bluetooth, внешние устройства “видят” рандомный MAC адрес.

Уведомления

    В этом релизе удалён метод Notification.setLatestEventInfo(). Вместо него для создания уведомлений используйте класс Notification.Builder. Для неоднократного обновления уведомлений используйте экземпляр Notification.Builder. Для обновления экземпляров Notification вызывайте метод build().
    Команда “adb shell dumpsys notification” больше не выводит ваш текст уведомления. Вместо неё используйте компанду “adb shell dumpsys notification --noredact”.

Изменения в AudioManager

    Прямая настройка громкости или отключение звука конкретных потоков через класс AudioManager больше не поддерживается. Метод setStreamSolo() объявлен устаревшим и вместо него нужно вызывать метод requestAudioFocus(). Аналогично объявлен устаревшим метод setStreamMute() и вместо него нужно вызывать метод adjustStreamVolume(), передавая значения напрямую ADJUST_MUTE и ADJUST_UNMUTE.

Выделение текста

    Условие: Action bar осталось без перевода. Но вообще что-то вроде text-selection“панели задач”, точнее даже “панель действий”. Это панель в верхней части приложений, где всякие кнопки, типа “Меню”, “Создать новое” и подобное. Также не переведены View и Activiry. Это самостоятельные базовые сущность в Android и я не знаю, как правильно можно это перевести. Вьюшки - это все эти кнопки, картинки (точнее то, что эти картинки отображает), панельки, и прочее. Активити - это то, на чём “лежат” вьюшки.    Когда пользователь выделяет текст в вашем приложении, в плавающей панели вы можете отобразить для этого выделения действия, такие как Вырезать, Копировать, и Вставить. Реализация взаимодействия с пользователем подобна тому, что было с контекстным action bar, описанным во “Включение режима контекстных действий для отдельных view”.
    Для использования плавающей панели для выделения, сделайте следующие изменения в ваших приложениях:
  1. В ваших View или Activity измените вызовы ActionMode со startActionMode(Callback) на startActionMode(Callback, ActionMode.TYPE_FLOATING).
  2. Замените существующий ActionMode.Callback на расширенный ActionMode.Callback2.
  3. Переопределите метод onGetContentRect() для предоставления координат содержимого Rect (в частности прямоугольника выделения) во view.
  4. Если положение прямоугольника выделения больше не валидны и только его нужно сделать недействительным, вызовите метод invalidateContentRect().
    Если вы используете Android Support Library ревизии 22.2, имейте в виду, что плавающие панели инструментов не являются обратно-совместимыми и поведение задаётся appcompat (замечание: это такая библиотека из состава Android Support Library) через объекты ActionMode. Из-за этого блокируется отображение плавающих панелей инструментов. Для включения поддержки ActionMode в AppCompatActivity, вызовите getDelegate(), затем вызовите setHandleNativeActionModesEnabled() в возвращённом объекте AppCompatDelegate и установите параметр ввода в false. Этот вызов вернёт управление объектами ActionMode во фреймворк. На устройствах, работающих под  Android 6.0 (API level 23), это позволяет фреймворку поддерживать режимы ActionBar или плавающей панели инструментов. Если устройство работает под Android 5.1 (API level 22) или ниже, то поддерживается только режим ActionBar.

Комментариев нет:

Отправить комментарий