はじめに
Android 10が9/3にリリースされました。まずはpixelシリーズからローリングアウトされ、今年中にはサードパーティの端末にも適用される予定です。Android10が正式名称となり、Android 9(Pie)まで続いていたお菓子のコードネームは無くなりました。また、圧倒的なハイスピードと低遅延次世代通信規格5Gや折りたたみ式スマホをサポートしています。
主な変更点
Android 10で追加された主な機能のまとめは以下になります。
バックグラウンドからの起動について
Android 10 は、アプリのアクティビティを起動するタイミングを制限します。この動作変更により、ユーザーに対する割り込みを最小限に抑え、ユーザーは画面内の表示内容を詳細に制御できるようになります。
Android 9(API レベル 28)以前をターゲットにしているアプリも含め、Android 10上で稼働するすべてのアプリに適用されます。また、アプリが Android 9 以前をターゲットにしていて、元々 Android 9 以前が稼働していたデバイス上にインストールされていた場合でも、デバイスを Android 10にアップグレードすると、この動作変更が適用されます。
アクティビティのパーミッションが必要とされる条件はこちらから確認することができます。
通常、Andorid 10上で稼働しているアプリがバックグラウンドから起動しようすると、AndroidStudioのlogcatに警告メッセージが表示されます。
1 | Background activity start from package-name blocked. |
バックグラウンドにあるアプリは、直接アクティビティを起動するのではなく、通知を作成してユーザーに情報を提供することが求められるようになりました。
ただし、現在進行形のアラームや着信などによって、ユーザーの注意を早急に引き付けることが必要となる場合があります。このような場合に備えて、これまではバックグラウンド アクティビティを起動するようにアプリを設定することがありました。Android 10で同じ動作を実装するには、次のような記述を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 | val fullScreenIntent = Intent(this, CallActivity::class.java) val fullScreenPendingIntent = PendingIntent.getActivity(this, 0, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT) val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("Incoming call") .setContentText("(919) 555-1234") .setPriority(NotificationCompat.PRIORITY_HIGH) .setCategory(NotificationCompat.CATEGORY_CALL) .setFullScreenIntent(fullScreenPendingIntent, true) val incomingCallNotification = notificationBuilder.build() |
通知ベースのアラート/リマインダーシステム
他のアプリを起動している最中でも画面上部に通知が表示され進行中の動作を邪魔することなく通知に対してアクションが可能になりました。例えば通話の際には通話を受けるか、拒否するかを選択できます。上記のようにフォアグラウンドで現在進行形のサービスに関連づけた通知の表は下記実装を行います。
1 2 | //各通知の「notificationId」に一意の整数を指定します。 startForeground(notificationId, notification) |
通知はユーザーの設定したサイレントモードのルールが適用されます。たとえば、サイレント モードが有効になっている場合でも、特定の相手からの着信のみを通知することができるようになります。
ストレージへの権限
Android 10では、複数のアプリで共有できる領域は写真、動画、音楽のみとなりました。
この領域にアクセスするにはREAD_EXTERNAL_STORAGEやWRITE_EXTERNAL_STORAGEを使用します。Android 10ではアプリごとに領域が作られ、他のアプリが管理する領域には直接アクセスすることができなくなりました。
他のアプリが作成したファイルにアクセスするには、
・アプリに READ_EXTERNAL_STORAGEパーミッションが付与されていること。
・対象ファイルが、写真(MediaStore.Images)、動画(MediaStore.Video)、音楽ファイル(Media.Audio)の中にあること。
が条件となります。
ダウンロード領域へのアクセスも可能ですがStorageAccessFrameworkのファイルピッカーを利用する必要があります。
位置情報制御
現在地のアクセス許可にアプリ使用中のみが追加されました。これまで「常に許可」or「許可しない」の2択でしたが、「使用中のみ許可」を選択することができるようになっています。Android 10をターゲットにしているアプリが、バックグラウンドで稼働しているときにデバイス位置情報にアクセスする必要がある場合、アプリのマニフェストファイル内で、次のように新しいパーミッションを宣言する必要があります。
1 2 3 4 | <manifest> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> </manifest> |
その他ユースケースによって異なる場合は詳細を確認しましょう。
動画、音声メッセージ等の音声のリアルタイムの字幕が自動的に表示されるようになります。タップするだけですべてのアプリで使うことができ、自分で録音した音声にも活用できます。この機能は、まず英語のみの対応となり、Google Pixel 端末にて秋頃から使えるようになる予定です。
Smart Reply
AIがメッセージに対して返信の候補を出してくれる機能が追加されました。さらに、メッセージに住所が含まれている場合に、「地図を開く」などのアクションを提示してくれます。Android 9 で、通知内に定型返信文を表示する機能が導入されましたが、Android 10 以降では、通知にインテントベースのアクションの候補を含めることもできます。さらに、こうした候補を自動生成できるようにもなっています。定型返信文の生成に使用される API は TextClassifier に含まれており、Android 10ではデベロッパーに直接公開されています。アプリで独自の候補を提供する場合、プラットフォームによる候補の自動生成は行われません。
※詳しくはこちらで確認できます。
設定でナビゲーションバーのないUIに切り替えられ、戻るボタンがなくなります。画面左または右から中央にスワイプすると一つ前の画面に戻るなど、インターフェイスをiPhoneライクにすることができます。ナビゲーションバー領域を排除し、アプリをフルスクリーン表示にできるようにすることができます。
Dark Thema
UIがダークになります。Dark Themaは以下のようなメリットがあります。
・デバイスの画面テクノロジーによっては電力使用量を大幅に削減できます。
・低視力のユーザーや明るい光に敏感なユーザーが画面を見やすくなります。
・すべてのユーザーが薄暗い環境でもデバイスを簡単に操作できます。
セキュリティアップデート
Androidは1ヶ月に1回のセキュリティアップデートを提供しており、アップデート提供後に新たな問題が見つかった場合は翌月のセキュリティアップデートを待たなければいけませんでした。Android10では、セキュリティアップデートがGoogle Playから配信されるので、従来より適用が早くできるようになります。
フォーカスモード
DigitalWellbeingを向上させる機能として、仕事や勉強中につい気になるアプリの起動を制限できます。アプリの通知やバックグラウンド稼働を停止することができます。
Kotlinに関する変更
通常、Kotlin 内で null 可能性規約違反が発生すると、コンパイル エラーになります。既存のコードとの互換性を維持するため、Android 9 の際に導入された新しいアノテーションは
@RecentlyNullable
と
@RecentlyNonNull
だけに限定されていました。これにより、null 可能性違反があっても、エラーではなく警告が出力されるようになっていました。今回、Android 9 のときに追加されていた
@RecentlyNullable
アノテーションと
@RecentlyNonNull
アノテーションは、それぞれ
@Nullable
と
@NonNull
に変更されました。null可能性違反があった場合は、警告ではなくエラーが出力されるようになります。
さいごに
Android10では主にセキュリティやプライバシーの面での変更が行われました。既存の機能にも知らないものもこの機会に学ぶことができました。
皆様のAndroid10実装のお役に立てればと思います。