Android 13の新機能と必要な対応について

この記事は[FLINTERS Advent Calendar](https://qiita.com/advent-calendar/2022/flinters) 2022の17日目です。

こんにちは！株式会社FLINTERSでGANMA!のAndroidアプリの開発をしています大塚です。今回は、2022年の今年にリリースされたAndorid 13（API Level 33）の新機能やアプリでの必要な対応についてGANMA! Androidアプリで対応したことを中心にご紹介したいと思います。

## 広告ID

Google Play開発者サービスの広告IDを使用し、Android 13（API Level 33）以上をターゲットとしているアプリでは、`AndroidManifest.xml`内で以下の権限を宣言する必要があります。

```gradle
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
```

アプリがAndroid 13以上をターゲットとしていて、この権限を宣言していない場合、広告IDは自動的に削除され、`00000000-0000-0000-0000-000000000000`のように0を羅列した文字列が返されるようになってしまいます。

アプリで使用しているSDKのマニフェストで既に広告の権限が宣言されている場合は、その権限がアプリのマニフェストファイルに統合されるため、アプリで宣言しなくてもOKです！

## Notification Runtime Permission

Android 13からRuntime Permissionに`POST_NOTIFICATIONS`が追加されました。Runtime Permissionとは、ユーザーの位置情報や連絡先情報のようなデータや、カメラ、マイクといった端末の機能を使用するためのアクセス権限のことです。Android 13からRuntime Permissionに通知権限が追加され、アプリからユーザーに通知を送信するためにはこの権限の許可を取得する必要があります。

<img width="500" alt="predictive-back-gesture" src="https://developer.android.com/static/images/permissions/notification-permission-a13-recommended-flow.svg">

Android 13を搭載した端末で、Android 13未満をターゲットしているアプリをインストールした場合、アプリの通知はデフォルトでオフになり、以下のタイミングで通知ダイアログが表示されます

> アプリが 12L（API レベル 32）以下をターゲットとする場合、権限ダイアログは、通知チャンネルの作成後にアプリが最初にアクティビティを開始したとき、または、アプリがアクティビティを開始して最初の通知チャンネルを作成したときに表示されます。通常、これはアプリの起動時です。

Android 13をターゲットに設定することで、開発者の意図したタイミングで権限ダイアログを表示することができるようになるため、対応がまだされていない場合は早めの対応をお勧めします。

Notification Runtime Permissionに対応するためには、まずアプリをAndroid 13以上にターゲットした上で、以下を`AndroidManifest.xml`に記述します。

```gradle
<manifest ...>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
</manifest>
```

その他の対応については他のRuntime Permissionの対応と同様ですので、詳細は[アプリの権限をリクエストする](https://developer.android.com/training/permissions/requesting)をご覧ください。

## Predictive Back Gesture (予測型「戻る」ジェスチャー)

Android 13からPredictive Back Gesture (予測型「戻る」ジェスチャー)という新機能が追加されました。Android 10 (API level 29)でジェスチャーナビゲーションが追加されましたが、今回の新機能ではジェスチャーでアプリを閉じる場合に遷移先の画面をプレビュー表示して、そのままアプリを閉じるか、現在の画面に止まるかが選択できるようになりました。

<img width="200" alt="predictive-back-gesture" src="https://developer.android.com/static/images/about/versions/13/predictive-back-nav-home.gif">

これは機能はオプトインの機能なので、適用するには`AndroidManifest.xml`に以下の設定を記述する必要があります。GANMA!アプリでも対応をしました！

```gradle
<application
    ...
    android:enableOnBackInvokedCallback="true"
    ... >
</application>
```

また、この機能を追加する場合に`Activity#onBackPressed()`や`KeyEvent#KEYCODE_BACK`が正常に機能しなくなるため、それら使ってバックイベントをハンドリングしている場合は、`OnBackPressedCallBack`や`OnBackInvokedCallback`のAPIを使用した実装に変更する必要があります。

## まとめ

以上、Android 13対応について、GANMA! Androidアプリで対応したことを中心に紹介させていただきました。個人的には通知が許可制になったことで、アプリインストールするたびに、毎回設定から通知の設定をしにいかなくても良くなったことがAndroidユーザーとして一番嬉しい変更だなと感じています！

今回紹介したこと以外にも
- [テーマ別アプリアイコン](https://developer.android.com/about/versions/13/features#themed-app-icons)
- [アプリごとの言語設定](https://developer.android.com/about/versions/13/features/app-languages)
- [写真選択ツール](https://developer.android.com/about/versions/13/features/photopicker)

などの多くの新しい機能が追加されています！詳しくは [Android 13 の機能と変更点のリスト](https://developer.android.com/about/versions/13/summary)にまとまっていますので、そちらをご覧ください。

## 参考
- [Android 13 features and changes list](https://developer.android.com/about/versions/13/summary)
- [Behavior changes: all apps](https://developer.android.com/about/versions/13/behavior-changes-all)
- [Behavior changes: Apps targeting Android 13 or higher](https://developer.android.com/about/versions/13/behavior-changes-13)
- [Advertising ID](https://support.google.com/googleplay/android-developer/answer/6048248)
- [Notification runtime permission](https://developer.android.com/develop/ui/views/notifications/notification-permission)
- [Add support for the predictive back gesture](https://developer.android.com/guide/navigation/predictive-back-gesture)
- [Predictive back gestureの対応](https://star-zero.medium.com/predictive-back-gesture%E3%81%AE%E5%AF%BE%E5%BF%9C-415fe9a37c79)