Android14の重要そうな差分まとめ

# はじめに
Android13が出てきたのがつい先日のように感じますが、もうAndroid14がでようとしていますね。
個人的にはAndroid13もそれなりに修正が必要な差分があり大変な印象がありましたが、１４ではどうでしょうか？
先んじて重要そうな差分を備忘録的にまとめておこうと思います。

# 正確なアラームのスケジュール設定がデフォルトで拒否される

> Android 13 以降をターゲットとする新しくインストールされたアプリのほとんどで、SCHEDULE_EXACT_ALARM 権限が自動的に付与されなくなりました（権限はデフォルトで拒否されます）。

https://developer.android.com/about/versions/14/changes/schedule-exact-alarms?hl=ja

とのことです。
アラームって最近使うことないですが、使用されているプロジェクトで自動付与の恩恵を受けているプロジェクトは上記権限要確認ですね。
ただし、 OnAlarmListenerを使用して通知を受けている場合は上記権限は必須でないようです。

# フォアグラウンド サービス タイプが必須

>Android 14 をターゲットとするアプリでは、アプリ内のフォアグラウンド サービスごとにフォアグラウンド サービス タイプを 1 つ以上指定する必要があります。

https://developer.android.com/about/versions/14/behavior-changes-14?hl=ja#fgs-types

現状フォアグラウンドのサービスを使用している場合、該当するサービスタイプを指定する必要があるようです。
どうやら公式的にはできる限りWorkManagerを使用するように調整して欲しいようですが、引き続きフォアグラウンドサービスを使用する場合は、以下のようにマニフェストへサービスタイプを設定する必要があります。

``` manifest.xml
<manifest ...>
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
    <application ...>
      <service
          android:name=".MyMediaPlaybackService"
          android:foregroundServiceType="mediaPlayback"
          android:exported="false">
      </service>
    </application>
</manifest>
```

ちなみにサービスタイプの種類は以下です。

- camera
- connectedDevice
- dataSync
- health
- location
- mediaPlayback
- mediaProjection
- microphone
- phoneCall
- remoteMessaging
- shortService
- specialUse
- systemExempted

Android14をターゲットとした時点で上記サービスタイプが設定されていない状態でstartForeground()を呼び出すとMissingForegroundServiceTypeExceptionが返却されるようなので、こちらも対象プロジェクトは対応必須と言えますね。

# インストール可能な最小対象 API レベル

>targetSdkVersion が 23 未満のアプリはインストールできません。

https://developer.android.com/about/versions/14/behavior-changes-all?hl=ja#minimum-target-api-level

下限がAndroid6未満の場合はビルドエラーになるのではなく、完全にインストールができなくなるようですね。
ただAndroid６は2015年10月にリリースされたバージョンなので、約8年ほど前のバージョンです。
妥当な判断だという認識です、この機会に是非下限バージョンを見直してみてはいかがでしょうか。

# 暗黙的インテントとペンディング インテントの制限

> Android 14 をターゲットとするアプリの場合、Android により、アプリが内部アプリ コンポーネントに暗黙的インテントを送信することが制限されます。

https://developer.android.com/about/versions/14/behavior-changes-14?hl=ja#safer-intents

これは暗黙的インテントを送信すると例外が返却されるようになったようです。

以下がNG例です。
```main.kt
// Throws an exception when targeting Android 14.
context.startActivity(Intent("com.example.action.APP_ACTION"))
```

上記を以下のように明示的定義に変える必要があります。
```main.kt
// This makes the intent explicit.
val explicitIntent = Intent("com.example.action.APP_ACTION")
explicitIntent.apply {
    package = context.packageName
}
context.startActivity(explicitIntent)

```
Intent周りはAndroid12からかなりメス入れされていますね。
上記該当のプロジェクトは漏れるとクラッシュの原因になるので確実に対応しておきたいところです。

# 写真や動画への部分的なアクセス権を付与する
>Android 13（ API レベル 33）で導入されたビジュアル メディアの権限（READ_MEDIA_IMAGES と READ_MEDIA_VIDEO.）をアプリがリクエストしたときに、ユーザーは写真や動画への部分的なアクセス権を付与できます。

https://developer.android.com/about/versions/14/changes/partial-photo-video-access?hl=ja

これはすでにご存じの方も多い印象ですが、IOS14で実装されたメディアを細かく選択して許可を出す仕組みがAndroidにも導入される形となりました。
ちなみに今回**READ_MEDIA_VISUAL_USER_SELECTED**というパーミッションが追加されています。
Android14からが対象ですが、READ_MEDIA_IMAGESとREAD_MEDIA_VIDEOを足してユーザーに選択させる形式としたのがこちらのパーミッションになります。

新しいパーミッションを指定しなくてもAndroid13からのパーミッションを指定していたら選択式となりますが、Android14からのメディアアクセスは上記パーミッションを使うのが正そうですね。

# さいごに
Android14も結構色々ありそうな印象ですね。
各種修正が必要なプロジェクトは取りこぼしのないよう注意です。