Android Q・GoogleI/O発表でアプリに影響されると思われるところ

Androidエンジニアの備えが必要そうなところをが話題です。

Android Q Betaが3月だったのに今更ですがね！

## セキュリティー

https://developer.android.com/preview/privacy/checklist

#### Scoped storage
https://developer.android.com/preview/privacy/scoped-storage
アプリターゲットAPIがAndroid Qであればダウンロード、または各メディアフォルダー（音楽、写真など）を接近するための新規パーミッション、APIが追加されます。それ以外の共有フォルダーには接近不可能になります。アプリは独立されたストレージを使わないとダメですね。

#### More user control over location permissions
https://developer.android.com/preview/privacy/device-location
Android Qの環境で動くデバイスで、アプリがフォアグラウンド状態の時だけ位置情報を確認できるパーミッションが追加されます。バックグラウンドでも位置情報を確認したい場合はユーザーに許可を求めるUXが必要になります。

#### Background activity starts
https://developer.android.com/preview/privacy/background-activity-starts
Android Qの環境で動くデバイスで、バックグランド状態のアプリは新しいActivityの生成ができません。これはフォアグラウンドサービスでも同じです。
必ずバックグラウンドActivityを生成する場合、`FullScreenIntent`Notificationを使えばいいです。

https://developer.android.com/reference/android/app/Notification#fullScreenIntent

#### Non-resettable hardware identifiers
https://developer.android.com/preview/privacy/data-identifiers#device-identifiers
Android Qはユーザーがリセットできない識別子を提供しません。Android Q環境で識別子を確認する場合`null`か`unknown`が取れます。
対案としては広告ID、InstanceID、SSAIDがあります。

#### Permission for wireless scanning
https://developer.android.com/preview/privacy/camera-connectivity#fine-location-telephony-wifi-bt
アプリターゲットAPIがAndroid Qであれば、Wi-Fi、Bluetoothなどユーザーの位置を確認するAPIを使うには`ACCESS_FINE_LOCATION`パーミッションが必要になります。

## ダークモード
https://developer.android.com/preview/features/darktheme
Android Qのシステム設定でDark themeを選択すれば、DayNight Styleで作られたアプリも自動的にダークモードになります。要するに、Android Qのダークモード設定に合わせたいのであればDayNight Style（またはDayNight継承Style）を使う必要があります。

## 強制・推奨アップデート
https://developer.android.com/guide/app-bundle/in-app-updates
API21以上、Play Core library1.5.0以上ならばサーポートする強制・推奨アップデート機能です。もうバージョンチェックのために別途のシステムが必要なく、アプリ実装で終わること人なりました！888888
App Bundleはアップデートサイズに150MBの制限があって、obbファイルみたいなAPK拡張ファイルは対応しません。

## ジェスチャー導入
https://developer.android.com/preview/features/gesturalnav
画面スワイプによって以前の画面に行ったり、ホームに戻ったり、マルチタスクをしたりできます。それで下のボタンがなくなるのではありません。ユーザーはOSの設定でジェスチャー、2ボタン方式、3ボタン方式を切り替えることができます。
そしてもしアプリに必要があって画面端っこからスワイプを定義したら以下のように回避が必要です。

```
    //rectはジェスチャーの動きから除外する領域
    var exclusionRects = listOf(rect1, rect2, rect3)

    fun onLayout(
            changedCanvas: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
      // Update rect bounds and the exclusionRects list
      setSystemGestureExclusionRects(exclusionRects)
    }

    fun onDraw(canvas: Canvas) {
      // Update rect bounds and the exclusionRects list
      setSystemGestureExclusionRects(exclusionRects)
    }
    
```

そしてホーム画面、クィックスウィッチのジェスチャーである下端っこからのジェスチャーは衝突対応ができなく、`Window.setSystemGestureExclusionRects()`を使って問題をちょっと緩和するくらいらしい。

## その他
#### Bubble
https://developer.android.com/preview/features/bubbles
Android QはSYSTEM_ALERT_WINDOWの許可を出しません。対案としてBubblesというAPIが追加されました。

#### Android Studio 3.5
Live Class Generationが可能になり、rebuildしなくてもData bindingした変数が確認できます。
そしてdata bindingのrefactoringもサーポートし、
ついにdata bindingのcompile errorが確認できます。

#### JetPack、AndroidX、そしてKotlin
CameraXのJetPack参加、7年ぶりのViewPagerのアップデートであるViewPager2アルファバージョンはAndroidXが必要です。既存のアプリはそろそろJetPackとAndroidXにマイグレーションする準備が必要があるのかな。
そして今年もKotlin推しは相変わらず。Kotlin関連ライブラリはKTXだけではなく、APIデザインもKotlinにすると発表しました。