Marshmallow. Это должен сделать каждый. Добавляем поддержку SDK 23 в наши приложения

от автора


Привет всем разработчикам под Android!

Мне повезло стать Google Developer Expert Android в России, и поэтому я вдвойне переживаю, что не все из вас подготовились к релизу заранее. Сейчас мы с вами постараемся запрыгнуть на уплывающий пароход с зефирками.

Вы можете не читать, а просто посмотреть мой доклад на прошедшем DroidCon.

Но специально для тех, кто любит читать хабр больше чем смотреть youtube — добро пожаловать под кат. Там мы пройдемся по чеклисту действий, которые каждый обязательно должен сделать в своем приложении, а потом посмотрим на новые возможности для разработчиков в sdk 23.

Важное замечание

Всё нижесказанное относится только к приложениям с targetSdk = 23 и выше! Как будут вести себя приложения с более старыми sdk на зефирке готов обсудить в комментариях.

Doze Mode, App Standby и Runtime Permissions

К сожалению длина статьи не смогла вместить эти три важнейших изменения в Android Marshmallow. Пожалуйста, прочтите о них в отдельной статье.

Autobackup

Теперь Android приложения каждую ночь, пока девайс на зарядке, будут сливать в пользовательский Drive все настройки. Вернее, те которые мы разрешим.

Зачем?
Пользователь при покупке нового сразу восстанавливает из Google Play не только все приложения, но и их настройки.
Чем плохо для нас?
В облако и на новые девайсы улетают из shared preferences данные аккаунтов и ключи GCM (пуши перестают работать). Нужно это предотвратить!

По дефолту бэкапятся все папки нашего приложения и все SharedPreferences.
Не сохраняются лишь:
— пути на SD карте, не находящиеся в android/data/…
getCacheDir()
getCodeCacheDir()
getNoBackupFilesDir()
Последняя папочка специально для этого как раз и создана.

Чтобы предотвратить часть файлов от бекапа пишем вот такую xml, где перечисляем все данные, которые не желаем пускать в бекап:

<android:fullBackupContent="@xml/mybackupscheme"><full-backup-content>    <exclude domain=   ["file" | "database" | "sharedpref"| "external" | "root"] path="string”>  </full-backup-content> 

Чтобы определить наоборот лишь те файлы, которые хотим пустить в облако:

<android:fullBackupContent="@xml/mybackupscheme"><full-backup-content>    <include domain=   ["file" | "database" | "sharedpref"| "external" | "root"] path="string”>  </full-backup-content> 

Если в бекап таки ушли ненужные для восстановления данные, мы можем сделать вот такую хитрость:
В классе наследнике Application переопределить метод onRestoreFinished() и в нем удалить нежелательно восстановленные записи.

! Уберите из бекапа ключи Google Cloud Messages !

Подробнее: developer.android.com/intl/ru/training/backup/autosyncapi.html
Пример: developer.android.com/intl/ru/samples/AutoBackupForApps/index.html

Deprecated

Если вы еще используете Apache Http client и напрочь отказываетесь перейти на современные аналоги, например, OkHttp, то вам срочно нужно добавить в build.gradle:

android { useLibrary 'org.apache.http.legacy' } 

Теперь из sdk выпилили OpenSSL: libcrypto.so и libssl.so заменены на BoringSSL.

Если вы вдруг не знали до сегодняшнего дня о Notification.Builder, а использовали для содания нотификаций notification.setLatestEventInfo(), хватит, он удален. Прочитайте хотя бы мою статью, а лучше официальные доки, как правильно создавать и обновлять уведомления.

Adoptable storage

Теперь пользователь может отформатировать sd-карточку, превратив ее в почти внутреннее шифрованное хранилище. И тем самым у него появится переносить приложения на нее. Чем это грозит для нас?

Если мы не используем в приложении стандартные методы и константы для получения путей (getFilesDir(), getCacheDir() и т.д.), а хардкодим пути к внутреннему хранилищу, то после перемещения файлов на карту точка монтирования сменится, и все наши старательно прописанные пути перестанут быть валидными.

Подробнее: developer.android.com/intl/ru/about/versions/marshmallow/android-6.0.html#adoptable-storage

Небольшие, но важные дополнения

Доступ к мак адресам устройств в округе теперь возможен только при сканировании методами WifiManager.getScanResults() BluetoothLeScanner.startScan() и при запрошенных пермишенах ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION. А вот методы WifiInfo.getMacAddress() и BluetoothAdapter.getAddress() вернут всегда пустышку 02:00:00:00:00:00. это сделано в целях повышения секьюрности пользователя. Жаль не все обновятся на marshmallow, да и кастомные прошивки вряд ли сохранят это ограничение.

Из Android Keystore provider выкинули поддержку DSA-шифрования

Теперь состояния WifiConfiguration объектов наши приложения могут менять только, если они сами их создали.

У камеры хорошие изменения по работе с доступом к сервису. Если приложение ушло в фон, а другое приложение наоборот вышло на первый план, то ему отдастся приоритет, а первое лишится сервиса. А еще, теперь можно использовать из разных приложений одновременно доступ к разным камерам устройства.

Изменения в ART

  • Теперь корректно реализована обработка прав на newInstance().
  • Динамический линкер теперь понимает различия между soname библиотеки и ее путем, а еще появился поиск по soname.
  • Починили флаг dlopen(3) RTLD_LOCAL.

Новые возможности Android

С обязательными изменениями в нашем приложении покончено. Перейдем к основным фичам, которые нам предоставляет новый SDK.

App Linking

Многие разработчики встраивают в свои приложения фильтры url-схем, чтобы пользователю было предложено открыть определенный url с помощью приложения. Теперь появилась возможность лишить возможности других разработчиков обрабатывать url вашего сайта. Допустим если вы делаете банкинг, то точно не хотите, чтобы другие приложения, кроме приложения-клиента вашего банка могли открываться по нажатию пользователем на ссылку.

в манифесте нужно добавить вот такого вида фильтр:

<intent-filter android:autoVerify="true">         <action android:name="android.intent.action.VIEW" />         <category 	android:name="android.intent.category.DEFAULT" />         <category  	android:name="android.intent.category.BROWSABLE" />         <data android:scheme="http" 	android:host="www.android.com" />         <data android:scheme="https" 	android:host="www.android.com" />     </intent-filter> 

И положить JSON на свой сайт (https://www.domain1.com/.well-known/assetlinks.json), вставив sha256 из кейстора, которым подписано приложение.

[{     "relation": ["delegate_permission/common.handle_all_urls"],     "target": {       "namespace": "android_app",       "package_name": "com.example",       "sha256_cert_fingerprints":      ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]     } }] 

Единственное, о чем стоит помнить: если ваше приложение не будет установлено, то выскочит диалог «открыть с помощью» и приложение злоумышленника сможет открыться.

Подробнее: developer.android.com/intl/ru/training/app-links/index.html

Fingerprint API

Наконец-то в Android появилась нативная поддержка сенсоров отпечатков пальцев. Теперь с помощью класса android.hardware.fingerprint.FingerprintManager проверяем наличие в устройстве сенсора isHardwareDetected(), запрашиваем разрешение USE_FINGERPRINT, и если у пользователя есть откатанные пальчики hasEnrolledFingerprints(), показываем стандартный диалог авторизации по отпечатку authentificate()

Подробнее: www.youtube.com/watch?t=1&v=VOn7VrTRlA4
Пример: developer.android.com/intl/ru/samples/FingerprintDialog/index.html

Confirm Credentials

Теперь у нас есть возможность перепроверить, что сейчас устройство в руках у его владельца, показав экран разблокировки перед важным действием в приложении, например, при попытке открыть папку "/отдых в Адлере 2007/"
Подробнее: github.com/googlesamples/androidConfirmCredential/blob/master
Application/src/main/java/com/example/android/confirmcredential/MainActivity.java
Пример: developer.android.com/intl/ru/samples/ConfirmCredential/index.html

Text Selection

Теперь контекстное меню для действий с выделенным текстом появляется непосредственно рядом с кареткой, для добавления своих действий мы так же можем воспользоваться меню, описанным в menu.xml, и добавить его с помощью метода startActionMode(Callback, ActionMode.TYPE_FLOATING).

Подробнее: developer.android.com/intl/ru/about/versions/marshmallow/android-6.0-changes.html#behavior-text-selection

Direct share

Важным дополнением в Marshmallow является возможность добавлять одному приложению до восьми различных объектов в стандартный диалог шаринга:

Главное не захламить диалог бесполезными вариантами шаринга. Старайтесь не злоупотреблять.

Подробнее: developer.android.com/intl/ru/about/versions/marshmallow/android-6.0.html#direct-share
Пример: developer.android.com/intl/ru/samples/DirectShare/index.html

Voice Interaction

Важная, но не так подробно освещенная фишка, в отличии от «Now on tap» . Наше приложение, будучи запущенным из Google Now может вести диалог с пользователем с помощью класса android.app.VoiceInteractor.

Подробнее: developers.google.com/voice-actions/interaction/voice-interactions.

На этом список не заканчивается. Более мелкие нововведения можно прочитать тут.

Обязательно пройдитесь по всем пунктам выше. Проверьте autobackup, doze mode и запросите все пермишены. На все вопросы буду рад ответить в комментариях.

ссылка на оригинал статьи http://habrahabr.ru/post/269471/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *