この記事は Product Manager, Google Maps Platform の Ilya Bezdelev による Google Cloud Blog の記事 "Learn about our updated renderer for the Maps SDK for Android" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

Google は、Android における Google Maps Platform の開発体験を向上させる方法を常に模索しています。そのため、Maps SDK for Android のレンダラを更新し、より多くの機能とより優れたパフォーマンスを提供できるよう取り組んでいます。

2021 年 10 月に更新したレンダラをご利用いただいているデベロッパーの皆様に感謝申し上げます。最新バージョンには、良い点や改善案などの皆様からのフィードバックに基づいた改良が施されており、すぐにお試しいただけます。アップグレードされたマップレンダラは、Maps SDK for Android のバージョン 18.0.0 以降でご利用いただけます。オプトインしてご利用のうえ、機能の不具合報告については適宜お知らせいただければ幸いです。

新しいマップレンダラの利点は次のとおりです。

  • ネットワーク負荷、処理要求、メモリ使用量の軽減
  • 以前のレンダラよりも高速なコールド スタート
  • 安定性とユーザー エクスペリエンスの向上
  • 操作処理の改良により、アニメーションの質が向上し、パンとズームがより滑らかに
  • 画面の切り替えをより滑らかにし、地図ラベルの位置もさらに鮮明に
新しいレンダラを使用できるデバイス :
  • Android 5.0(API レベル 21)以降
  • 2 GB 以上のデータ ストレージ
  • Google Play 開発者サービス バージョン 21.39.14 以降の使用
デバイスで Android 4.4W(API レベル 20)以前を使用している場合、デバイスのデータ ストレージが 2 GB 未満の場合、またはデバイスでバージョン 21.39.13 以前の Google Play 開発者サービスを使用している場合は、従来のレンダラを引き続きご利用ください。

新しいマップレンダラにアップグレードする方法

MapsInitializer.initialize() を呼び出してレンダラ バージョンをリクエストする方法について 2 つのコードサンプルを次に示します。

import com.google.android.gms.maps.MapsInitializer;

import com.google.android.gms.maps.MapsInitializer.Renderer;

import com.google.android.gms.maps.OnMapsSdkInitializedCallback;

class MapRendererOptInApplication extends Application implements OnMapsSdkInitializedCallback {

 @Override

 public void onCreate() {

   super.onCreate();

   MapsInitializer.initialize(getApplicationContext(), Renderer.LATEST, this);

 }

 @Override

 public void onMapsSdkInitialized(MapsInitializer.Renderer renderer) {

   switch (renderer) {

     case LATEST:

       Log.d("MapsDemo", "The latest version of the renderer is used.");

       break;

     case LEGACY:

       Log.d("MapsDemo", "The legacy version of the renderer is used.");

       break;

   }

 }

}

Java のコードサンプル

import com.google.android.gms.maps.MapsInitializer

import com.google.android.gms.maps.MapsInitializer.Renderer

import com.google.android.gms.maps.OnMapsSdkInitializedCallback

internal class MapRendererOptInApplication : Application(), OnMapsSdkInitializedCallback {

 override fun onCreate() {

   super.onCreate()

   MapsInitializer.initialize(applicationContext, Renderer.LATEST, this)

 }

 override fun onMapsSdkInitialized(renderer: MapsInitializer.Renderer) {

   when (renderer) {

     Renderer.LATEST -> Log.d("MapsDemo", "The latest version of the renderer is used.")

     Renderer.LEGACY -> Log.d("MapsDemo", "The legacy version of the renderer is used.")

   }

 }

}

Kotlin のコードサンプル

お問い合わせ

レンダラがうまく機能せずお困りの場合、Issue Tracker に問題点を登録してください。できる限り早急に対応いたします。Android 用の新しいマップレンダラをオプトインして使用を開始する方法については、こちらのドキュメントをご覧ください。機能の具合について、皆様からのフィードバックをお待ちしております。すでに新しいレンダラにアップグレードされた方には、今後のサービス向上のため簡単なアンケートにご回答いただいております。ご協力のほどよろしくお願いいたします。

Google Maps Platform に関する詳しい情報はこちらをご覧ください。ご質問やフィードバックはページ右上の「お問い合わせ」より承っております。 

Posted by 丸山 智康 (Tomoyasu Maruyama) - Developer Relations Engineer 


この記事は Developer Advocate の Alex Muramoto による Google Cloud Blog の記事 "Announcing Advanced Polylines for the Maps SDKs for Android" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

デベロッパーによる Google マップの基本地図のスタイル設定とカスタマイズを可能にする継続的な取り組みの一環として、この度、Maps SDK for Android 向けの高度なポリラインのスタイル設定の提供を開始することを発表します。この機能は、現在 Google が提供しているポリライン機能の上に構築されています。デベロッパーはこの機能を使って、地図上に表示される定型の線を作成できます。こうした定型の線は、経路、パレードルート、通行止めなどの情報を表すためによく使用されます。ポリラインは、Google Maps Platform のデベロッパーが、ユーザー向けに地図をカスタマイズする際に最もよく使う機能の一つです。

高度なポリラインのスタイル設定では、マルチカラー ポリライン、グラデーションのポリライン、スタンプ型ポリラインの 3 つの新しいポリラインのカスタマイズを導入することで、ポリラインのコア機能をより豊かに、表現力のあるものにできます。

高度なポリラインのスタイル設定は、最新のレンダラを有効にしたバージョン 18.1.0 以降の Maps SDK for Android とバージョン 5.2.0 の Maps SDK for iOS において、利用可能です。

マルチカラー ポリライン

マルチカラー ポリラインを使うと、ポリラインをセグメント化し、各セグメントに異なる色を適用して情報を表現することができます。このカスタマイズは、経路上のさまざまな情報を伝える、季節のキャンペーンで企業のブランディングに合わせる、あるエリアに注目を集めるなど、さまざまなユースケースで活用できます。

マルチカラー ポリラインを使用するには、`StyleSpan` オブジェクトを作成し、`addSpan()` または `addSpans()` メソッドを `PolylineOptions` に追加します。デフォルトでは、配列の各アイテムが対応する線分の色に設定されます。次の例では、セグメントの色を設定して、緑と紫(マゼンタ)のセグメントを持つポリラインを作成しています。

 Polyline line = map.addPolyline(new PolylineOptions()

        .add(new LatLng(37.789258, -122.387819),

          new LatLng(37.786572, -122.390556),

          new LatLng(37.786140, -122.390899))

        .addSpan(new StyleSpan(Color.MAGENTA))

        .addSpan(new StyleSpan(Color.GREEN))

      );

グラデーションのポリライン

グラデーションのポリラインは、ポリライン全体に 2 色のグラデーションを適用します。交通の流れや標高の変化など、強弱の変化を表現するのに便利です。

グラデーション ポリラインを使用するには、ポリラインの開始色と終了色を設定する 2 つの 32 ビットの ARGB(alpha、red、green、blue)値を指定してグラデーションを定義し、次に `PolylineOptions.addSpan()` を呼び出して、このプロパティを図形のオプション オブジェクトに設定します。

以下は、サンフランシスコからランチョ コラール デ ティエラまでのグラデーション ポリラインを作成する例です。

 Polyline line = map.addPolyline(new PolylineOptions()

        .add(new LatLng(37.662953, -122.400542), new LatLng(37.5414277, -122.4845455))

        .addSpan(new StyleSpan(StrokeStyle.gradientBuilder(Color.GREEN, Color.RED).build())));

スタンプ型ポリライン

スタンプ型ポリラインを使うと、選択したビットマップ画像を繰り返し使ってポリラインを作成できます。これにより、図形とポリラインの外観のカスタマイズが可能になります。

スタンプ型ポリラインを使用するには、`TextureStyle` の `StampStyle` を作成して、ポリラインの外観をビットマップ テクスチャの繰り返しに設定します。このプロパティは、`PolylineOptions.addSpan()` を呼び出すことで、図形のオプション オブジェクトに設定できます。

 StampStyle stampStyle = TextureStyle.newBuilder(BitmapDescriptorFactory.fromResource(R.drawable.arrow)).build();

Polyline line = map.addPolyline(

new PolylineOptions()

.add(

new LatLng(37.789258, -122.387819), 

new LatLng(37.786572, -122.390556), 

new LatLng(37.786140, -122.390899))

.addSpan(new StyleSpan(StrokeStyle.colorBuilder(Color.BLUE).stamp(stampStyle).build()))

.addSpan(new StyleSpan(StrokeStyle.colorBuilder(Color.YELLOW).stamp(stampStyle).build()))

);

スタイル設定とカスタマイズ機能は、ユーザーにより良いマッピング サービスを提供し、重要な情報を伝え、独自の地図を作り上げるために、最適かつ最も簡単な方法の一つです。最近リリースしたクラウドベースのマップスタイル設定、データドリブンのスタイル設定、WebGL を活用したマップ機能などのスタイル設定やカスタマイズ機能はもちろんのこと、Google Maps Platform チームは、それぞれのニーズを満たす柔軟性を備えた素晴らしいマッピング サービスを提供するツールをお届けできるよう、取り組みを続けています。この新しい、マップ上のポリラインのカスタマイズとスタイル設定をぜひご活用ください。

Google Maps Platform に関する詳しい情報はこちらをご覧ください。ご質問やフィードバックはページ右上の「お問い合わせ」より承っております。


Posted by 丸山 智康 (Tomoyasu Maruyama) - Developer Relations Engineer 


本プログラムではオンライン学習ツール Pathways 上にあるネイティブ Android UI を開発するための最新のツールキット「Compose」について学習します。

お申し込みはこちら

    Android Study Jams の流れ :

    1. Android Study Jam ウェブサイト上部の "Register" ボタンから参加登録

    2. Google Developers Profile をお持ちでない場合)Google Developers アカウントのセットアップ
      https://developers.google.com/ へアクセスし、Developer Profile を作成いただけます。

    3. 7 月 19 日(火)16:00 ~ 18:00 のオンライン キックオフ セッションに参加(任意)

    4. Jetpack Compose Pathway (合計 13 件のアクティビティ)を完了しましょう。
      ※ 7 月 19(火)~ 8 月 19 日(金)の期間内にバッジを獲得された方のみ、グッズ企画の対象となりますので、ぜひ期間中に Pathway を完了してみましょう!

    5. 期間内にクイズを受講し、バッジを獲得

    6. 先着順でグッズ企画のキャンペーンに応募


    プログラム概要

    プログラム期間 : 2022 年 7 月 19 日(火) ~ 8 月 19 日(金)

    キックオフ セッション : 2022 年 7 月 19 日(火)16:00 ~ 18:00

    Compose を初めてご利用いただく方にもご安心いただけるように、キックオフ セッションで使い方を説明し、いくつかのラボを解説つきで実施します。(本セッションは、アーカイブでもご覧いただけます。セッションに参加できなくても、プログラムに参加して学習することは可能です)

    対象 : Android, Compose を学びたい大学生以上の方

    費用 : 無料

    実施方法 : オンライン


    参加特典

    本プログラムに登録しプログラムを修了した参加者には、下記のノベルティをプレゼントいたします。


    コミュニティ支援

    1 人ではなかなか思うように勉強が進まない方を支援することを目的とした、勉強会を開催するコミュニティを募集します。コミュニティが主催する勉強会に参加することで、1 人では解決しなかった課題などを解決しましょう。

    コミュニティ主催の勉強会の情報は随時こちらのブログで更新していきます。また主催者となって勉強会を開催してくださるコミュニティのオーガナイザーの方には Google からの支援をおこないますので、こちらのフォームから申し込んでください。

    皆様のご参加をお待ちしております。


    お問い合わせ

    [email protected] 


    Posted by Takuo Suzuki - Developer Relations Team

    Share on Twitter Share on Facebook

    I/O では毎年、Android のプライバシーとセキュリティの最新機能についてお話ししています。しかし、ユーザーの皆さんの中には、Google が最新リリースでシームレスなエクスペリエンスを提供しつつ、安全性やプライバシーを強化している方法について、もっと詳しく知りたいと考えている方もいます。そこで、データ保護を強化し、プライバシーを高めてアプリの信頼性やデバイスのエクスペリエンスを向上するために開発しているツールについて、詳しく説明したいと思います。

    高速で邪魔にならないセキュリティ

    スマートフォンを使うのが消費者であっても企業であっても、デバイスとそこで実行されるアプリの妥当性を保証するうえで、重要な要素となるのが構成証明(attestation)です。基本的に、鍵の構成証明とは、デベロッパーがシークレットまたは指定されたデータをデバイスにバインドすることです。これは、この鍵が利用できる限り「同じユーザー、同じデバイス」であるという主張であり、暗号学的に妥当性を主張できます。

    Android 13 では、Android デバイスへの構成証明鍵のプロビジョニング方式を新しいモデルに移行しました。この方式はリモート鍵プロビジョニング(RKP)と呼ばれています。新しいアプローチでは、工場でのプロビジョニング エラーを無くし、鍵の脆弱性のリカバリ方法を提供することで、デバイスのセキュリティを強化します。具体的には、構成証明鍵の証明書管理ライフサイクルにおいて、Google の責任範囲を広げたアーキテクチャに移行することによって実現します。RKP の詳細は、こちらから確認できます。

    また、Google Play システム アップデートを使って直接アップデートできるモジュールをさらに増やします。これにより、シームレスかつ自動的により多くのシステム コンポーネントをアップグレードしたりバグを修正したりできるようになるため、デベロッパーはアップデートについて気にする必要がなくなります。現在、Android の 30 以上のコンポーネントが Google Play 経由で自動アップデートできる状態になっています。これには、Android 13 の新モジュールである Bluetooth や超広帯域無線(UWB)も含まれています。

    昨年は、主要なオペレーティング システムの脆弱性のほとんどが、C や C++ などのプログラミング言語の未定義の動作によって引き起こされていることについてお話ししました。Rust は高度なシステム プログラミング(OS、ネットワーク)に必要な効率と柔軟性を兼ね備えたもう 1 つの言語ですが、Rust にはメモリ安全性という追加の利点があります。うれしいお知らせですが、鍵管理コンポーネントやネットワーク スタックなどの Android のセキュリティ上重要な部分に、Rust が採用されています。

    強固なプラットフォームの実現は、メモリ安全性や不正利用防止技術などを継続的に改善することにとどまりません。強固な API サーフェスを実現して、エンドユーザーにより安全なエクスペリエンスを提供することもその一部です。

    Android 13 では、アプリ デベロッパーが意図せずに導入してしまいがちな潜在的脆弱性への対策として、たくさんの機能拡張を実装しました。その 1 つとして、アプリの特定のブロードキャスト レシーバをエクスポートしてデバイスの他のアプリに公開するかどうかをデベロッパーが指定できるようにすることで、ランタイム レシーバの安全性を向上しています。また、インテント フィルタで一致しないインテントをブロックすることで、アプリとそのコンポーネントの保護をさらに強化します。

    特定のセキュリティ認証要件に準拠しなければならない企業ユーザーのために、セキュリティ ログ レポートをアップデートして、セキュリティ ログのカバレッジを増やすとともに、ログを 1 か所にまとめるようにしました。この機能は、Common Criteria などの標準に準拠しなければならない企業に便利です。また、すべてのセキュリティ関連ログを 1 か所で審査できるので、管理ソリューション プロバイダなどのパートナーにとっても有益です。

    条件に合わせたプライバシー

    Android 13 では、プライバシーを重視したアプリを開発する方法が増えます。新しい写真ピッカーを使うと、別のアプリにメディア ライブラリへのアクセス権を与えることなく、共有したい写真や動画のみを選択できます。現在、アプリでこの機能を実装できるようになっています。

    Android 13 では、昨年導入した周辺デバイス パーミッションを利用して、動作するために位置情報を要求しなければならないアプリの数も減らします。たとえば、一部のアプリや状況で、Wi-fi を有効にするために位置情報をオンにする必要はなくなります。また、ストレージの動作を変更し、オーディオ、画像、動画のファイルにアクセスするパーミッションを別々に要求しなければならないようにしました。

    これまでは、アプリがバックグラウンドからクリップボードにアクセスすることは制限されており、それが行われた際には警告を表示していました。Android 13 では、短い周期でクリップボードの履歴を自動削除するので、アプリが以前にコピーされた情報を見ることはできなくなります。

    Android 11 より、長期間利用しなかったアプリに付与されたパーミッションの自動リセットが導入され、その後、この機能は Android 6 以降を実行しているデバイスにまで拡大されています。それ以来、50 億以上のパーミッションが自動リセットされました。

    Android 13 では、アプリ制作者がさらに積極的にパーミッションの削除ができるようになります。デベロッパーは、アプリが不要なパーミッションを保持する時間を短縮することで、プライバシーを強化できます。

    通知が多くのアプリにとって重要であることは認識していますが、ユーザーにとっては、すべての重要度で同じであるわけではありません。Android 13 デバイスの新規アプリは、デフォルトで通知を送信する前にパーミッションを求めることが義務づけられるので、アラートを受け取りたいアプリを細かく制御できるようになります。

    信頼できるアプリ

    ほとんどのアプリ デベロッパーは、パッケージ化された機能がバンドルされたさまざまなソフトウェア開発キット(SDK)を使ってアプリを開発しています。SDK はすばらしい機能を提供してくれますが、一般的に、アプリ デベロッパーが SDK コードの確認や調整を行うことはほぼ不可能です。パフォーマンスの分析も同様です。

    そこで、アプリの安全性を高めることを目的として、デベロッパーと連携して、新しい Google Play SDK Index を導入します。これにより、SDK のコードをアプリに組み込む前に、SDK の安全性や信頼性に関するシグナルを確認できるようになります。すべての方が、この仕組みを活用して、アプリのエコシステムのセキュリティとプライバシーを強化することができます。

    先月、Google Play で新しいデータ セーフティ セクションのロールアウトを開始しました。これにより、アプリがユーザーのデータをどのように収集、共有、保護する予定であるかを、アプリをインストールする前に知ることができます。また、さらに Play アプリの信頼性向上を促すため、デベロッパーが世界で認知されているモバイルアプリのセキュリティ標準である OWASP の MASVS に照らして、独立してアプリを検証できるようにしました。

    私たちは、少数のデベロッパー グループや認定ラボパートナーと共同で、このプログラムを進化させようとしています。この独立した検証を終えたデベロッパーは、その旨をデータ セーフティ セクションに表示することができます。

    その他のモバイル セキュリティと安全性

    現在、Google Play のマルウェア対策によって、1 日あたり 1,250 億個のアプリがスキャンされています。私たちは、それと同じように、スパムやフィッシングの検知には組み込みの機能が使われるべきだと考えています。うれしいことに、ある最新の分析レポートで、フィッシングと詐欺対策の組み込みメッセージング アプリとして、Messages が最も高い評価を受けました。

    現在、Messages は、毎月 15 億のスパム メッセージからの保護に役立てられています。そのため、迷惑メールも不正アクセスの試みも避けることができます。悪意のあるユーザーが情報を盗み取ろうとして、リンクをクリックさせようとしたり、アプリをダウンロードさせようとしたりするケースが増えています。そのため Google は、常に新たな防御策を探し続けています。

    昨年には Messages にエンドツーエンドの暗号化を導入し、モバイルでの会話のセキュリティを向上しました。今年は、グループ会話のエンドツーエンド暗号化をベータ版としてリリースし、個人のメッセージの保護をさらに強化する予定です。

    Google はたくさんの機能を開発していますが、それをオープンで透過性のある形で行っています。Android 11 では、スマートフォンでプライバシーを保ちながらデジタル ID を使えるようにするプラットフォーム機能についてお知らせしました。これは、ISO 規格に準拠した新機能でした。カード型の免許証(またはその他の身分証明書)を誰かに渡して確認してもらう場合、選択の余地はありません。つまり、相手はフルネーム、生年月日、住所などの個人を特定できる情報(PII)にアクセスできます。モバイル版ならもっと細かい制御が可能で、相手に何を公開するのかをエンドユーザーやアプリが厳密に選択できます。さらに相手も、返されたデータを保持するつもりかどうかを宣言しなければなりません。また、身元を明かすことなく、年齢などの一部の詳細情報を提示することもできます。

    直近 2 回の Android リリースでは、この API を改善し、サードパーティ組織がさまざまなデジタル身分証明のユースケースを簡単に利用できるようにしています。運転免許証、学生証、企業のバッジなどがその一例です。ここで、Google Wallet が Android Identity Credential を使ってデジタル ID と運転免許証をサポートすることを発表します。Google は、米国の各州や世界中の政府と連携し、今年中に Wallet でデジタル ID を実現する予定です。Google Wallet の新しい機能強化の詳細については、こちらからご覧ください。

    Android による保護

    Google は、皆さんのセキュリティとプライバシーはわかりやすく、制御しやすいものであるべきだと考えています。今年は、Android 13 デバイスの設定画面に、デバイスのセキュリティとデータのプライバシーのすべてを管理できる機能をロールアウトする予定です。

    新しいセキュリティとプライバシーの設定ページでは、安全性の状態を色分けされたシンプルな表現で示すほか、セキュリティとプライバシーを改善するための明確で実用的なガイダンスも提供する予定です。このページの中心は、新しいアクション カードです。安全性のリスクに対処するために実行すべき重要な手順が、そこに通知されます。問題について警告する通知のほかに、プライバシーを強化する方法についてのタイムリーなおすすめも提供したいと考えています。

    データを管理できているという安心感を得るには、信頼できる安全な土台が必要です。デバイスが安全でなければ、プライバシーの保護は望めないからです。Android が常に皆さんを守ることができるように、私たちは懸命に努力を続けています。その保護について詳しく知りたい方は、ウェブサイトをご覧ください。


    Reviewed by Eiji Kitamura - Developer Relations Team
    Share on Twitter Share on Facebook

    Figure 1: IME(例、Gboard)は 漢字の選択肢を表示
    Figure 1: IME(例、Gboard)は 漢字の選択肢を表示



    入力処理を行う IME アプリには、下記のような情報が保存されています。
    1. IME内のメニュを表示するための一般的な「漢字↔よみがな」の対応情報
    2. ユーザーが選択した変換の履歴に基づいた「漢字↔よみがな」の対応情報
    上記の 1 と 2 の情報は、IME のデータベースで管理されます。このデータベースは、ユーザーの入力や IME の人工知能によって、改善されてゆきます。

    つまり IME は「推測しにくい」よみがなを、ユーザーの文字入力によって、簡単に取得することができるように作られているのです。また、そのよみがなは、漢字の情報とともにデバイス上でデータベース化されます。

    Q:その貴重なデータをアプリケーションと提供する方法はないのでしょうか?
    A:はい!この記事を書いているのは日本語を利用する Android アプリ開発者の皆様にそれをご紹介するためです。Gboard で漢字の変換データをアプリと共有する API が利用可能になりました。

    Figure 2: 漢字入力とともに、よみがな情報を提供するIME



    この Gboard(v10.1 以降)に追加された API は、IME のテキスト出力に、よみがなを span として追加します。この API を利用するアプリケーションは、その出力を拾うことで、高い精度でユーザーの入力した文章に該当するよみがなを推測できるようになります。

    よみがな情報を取得するためには、漢字入力の対象となる TextEdit が下記の条件を満たす必要があります:

    • ア)inputType プロパティの値を textPersonName にする。
    • イ)privateImeOptions プロパティの値を com.google.android.inputmethod.latin.requestPhoneticOutput にする。
    Android Studio の Layout エディターで見た場合、設定は下記のようになります。

    Figure 3: Android Studioのプロパティ設定

    次に、TextWatcher を宣言し、入力通知の際、CharSequence から、getSpans() によって該当する TtsSpan を取得します。
    public class MainActivity extends AppCompatActivity {
    
        private class PhoneticRetriever implements TextWatcher {
            // Extracts phonetic metadata from an incoming text blob
            private String getPhoneticMetadata(CharSequence s) {
                String phonetic = null;
                if (s instanceof SpannableStringBuilder) {
                    SpannableStringBuilder textAsSpan = (SpannableStringBuilder) s;
                    TtsSpan[] allSpans = textAsSpan.getSpans(0, s.length(), TtsSpan.class);
                    if (allSpans.length == 1 && allSpans[0].getType().equals(TtsSpan.TYPE_TEXT)) {
                        // log shows where the span is in the text
                        Log.v("PHON",
                                s.toString() + " [" + textAsSpan.length() + "] start:" +
                                textAsSpan.getSpanStart(allSpans[0]) + " end:" +
                                textAsSpan.getSpanEnd(allSpans[0]));
                        phonetic =  allSpans[0].getArgs().getString(TtsSpan.ARG_TEXT);
                        textAsSpan.removeSpan(allSpans[0]); // avoid consuming again
                    }
                }
                return phonetic;
            }
            @Override
            public void afterTextChanged(Editable s) {
                String sphonetic = getPhoneticMetadata(s);
                if (sphonetic == null) {
              // no phonetic data
                } else {
                    // phonetic data is in sphonetic - use it as you like
                }
            }
    
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {}
        }
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            EditText etUserInput = (EditText)findViewById(R.id.editTextPhoneticWithOptions );
            etUserInput.addTextChangedListener(new PhoneticRetriever());
        }
    }
    

    このサンプルコードでは、afterTextChanged() のコールバックで TtsSpan を取得しています。TtsSpan.ARG_TEXT がよみがなで、getSpanStart()getSpanEnd() を利用すれば、入力された CharSequence の中で取得したよみがなの位置を取得することができます。

    実行可能なコードはこちらのレポジトリをご参照ください。
     → https://github.com/googlesamples/gboard-dev-samples/tree/main/GetIMEPhoneticName

    同じコードを使ったサンプルアプリケーションを Play Store からインストールすることも可能です。
     → https://play.google.com/store/apps/details?id=com.ragingsamples.getimephoneticname

    Google コンタクト アプリ(v3.37 以降)では、連絡先を編集する際、この API を使って漢字名に該当するよみがなが自動入力されます。自動入力の結果が誤っている場合でも、ユーザーは手動でよみがなを直すことができます。

    Figure 4: Google コンタクト アプリのよみがな推測

    この API を利用して取得したよみがなの使い道はみなさんの作るアプリ次第ですが、いくつか参考になるユースケースをご紹介します:
    • ユーザーの入力した名前から自動的によみがなを推測する。2021 年 5 月現在、この API は 名前にのみ対応しているため、ショッピング アプリや銀行アプリ、カスタム CRM アプリ、 SNS アプリなどで利用することができます。
    • 他の IME が Gboard と同じ API を提供することで、より多くのユーザーによみがなのサポートを提供する。

    ほかのユースケースのご提案、名前以外に将来的にサポートして欲しい入力タイプ、改善点などありましたら、ぜひフィードバックをお願いします。


    Posted by Alex Gimenez - Technical Solutions Consultant
    Share on Twitter Share on Facebook

    モバイル デバイスのセキュリティ評価は難しく、信頼できる方法で企業のクレイムを検証するには、独立した業界の認証(Certification)によるものである必要があります。スマートフォンの場合、特に確実なエンドツーエンドの認証(Certification)に Common Criteria(CC)Mobile Device Fundamentals(MDF)Protection Profile があります。Common Criteria は、31 か国に広がる大規模なセキュア IT プロダクトの相互認証(mutual recognition)を確立する原動力です。ここ数年間、すべての OS のバージョンで継続的に認証(Certification)を受けているスマートフォン メーカーは、Google、Samsung、Apple の 3 社のみです。2 月初頭には、現在サポート対象で、Android 11 を実行する Pixel スマートフォンのすべての認証(Certification)が完了しました。Google は、最新の OS バージョンで認証(Certification)を受けた最初のメーカーです。

    この認証(Certification)は、コンシューマや企業が直面する現実の脅威に対するデバイスの防御力を評価するために設計されています。次の表は、CC MDF 保護プロファイルに示されている脅威と対策の概要です。

    脅威

    対策

    ネットワークの盗聴 - 攻撃者がワイヤレス通信チャンネルなどのネットワーク インフラストラクチャ上に存在する

    ネットワーク攻撃 - 攻撃者がワイヤレス通信チャンネルなどのネットワーク インフラストラクチャ上に存在する

    通信の保護 - 安全な暗号化通信を保証する IPsec、DTLS、TLS、HTTPS、Bluetooth などの標準プロトコル

    認可と認証 - ネットワークやバックエンドの安全な認証(Authentication)

    モバイル デバイス設定 - ユーザーや企業の管理者が定義するセキュリティ ポリシーを設定して適用する機能

    物理アクセス - 物理アクセス可能な攻撃者は、モバイル デバイスから認証情報を含むユーザーデータの取得を試みる可能性がある

    ストレージの保護 - デバイスに含まれるデータを安全に保存(すなわち、保存データの暗号化) 

    認可と認証 - パスワード、PIN、指紋、顔認証など、既知のロック解除要素を利用した安全なデバイス認証(Authentication)

    悪意や欠陥のあるアプリケーション - モバイル デバイスに読み込まれたアプリケーションに、悪意のあるコードや悪用可能なコードが含まれる可能性がある 

    通信の保護 - 安全な暗号化通信を保証する IPsec、DTLS、TLS、HTTPS、Bluetooth などの標準プロトコル

    認可と認証 - ネットワークやバックエンドの安全な認証(Authentication)

    モバイル デバイス設定 - ユーザーや企業の管理者が定義するセキュリティ ポリシーを設定して適用する機能

    モバイル デバイスの整合性 - ソフトウェア、ハードウェアの両方における重要な機能のデバイスの整合性

    エンドユーザー プライバシーとデバイスの機能 - アプリケーション分離やサンドボックス化、フレームワーク アクセス許可により、ユーザー アクティビティごとの分離やプライバシーを提供

    恒常的な存在 - 攻撃者がデバイスに恒常的に存在する場合、デバイスは整合性を失い、それを取り戻せないことを意味する 

    モバイル デバイスの整合性 - ソフトウェア、ハードウェア両方における重要な機能の整合性を保証するためのデバイスの整合性が保たれている

    エンドユーザー プライバシーとデバイスの機能 - アプリケーション分離やサンドボックス化、フレームワーク アクセス許可により、ユーザー アクティビティごとの分離やプライバシーを提供


    この認証(Certification)が重要なのは、認定を受けたラボが実際にデバイスを評価し、さまざまなテストをして以下を確認しているためです。

    1. すべての対策があらかじめ定義された標準や基準を満たしている。
    2. すべての対策が公表されているとおりに機能する。

    概念的には、評価対象(TOE)はデバイスのハードウェア(システム オン チップ)とオペレーティング システム(Android)の組み合わせです。上記の脅威に対する対策を検証するため、ラボは以下のセキュリティ機能を確認します。

    これが企業にとって重要な理由

    Pixel のセキュリティが企業のニーズを確実にサポートできることは、非常に重要です。規制が厳しい業界の多くでは、機密データが考えられる限り最も強固な保護を受けられるように、Common Criteria 認証(Certified)デバイスの利用が義務付けられています。Android Enterprise 管理フレームワークでは、企業がデバイスの管理などをし、エンドユーザーが実行できる操作を制限したり、デバイスを監査してすべてのソフトウェアが適切に設定されていることを保証したりできます。たとえば、企業の IT 管理者は、カメラ、位置情報サービス、アプリのインストール プロセスなどの機能に対するポリシーを強制できます。

    これがコンシューマにとって重要な理由

    セキュリティは企業だけが心配することではありません。Common Criteria 認証(Certification)で検証している多くの保護は、コンシューマにも適用されます。たとえば、Wi-Fi に接続するとき、ウェブのブラウズを誰にも盗聴されないことを確認したいと思うでしょう。デバイスの紛失や盗難の際は、ロック画面によって他人が個人情報にアクセスする可能性が減ると確信したいはずです。

    Google は、すべてのユーザーにセキュリティとプライバシーをお届けしたいと考えています。Pixel デバイスがこの認証(Certification)基準以上を確実に満たせるようにしたいと考えているのはそのためです。今後もこの基準を満たすために注力しますので、どうぞご安心ください。Pixel スマートフォンでは、スイッチを入れた瞬間から充実したセキュリティを利用できます。

    これが Android エコシステムにとって重要な理由

    認証(Certification)はサードパーティによる検証として有用な形態ですが、以下の、Google が 3 C と呼ぶものに該当することがよくあります。

    • Complex(複雑) - デバイスのハードウェア、オペレーティング システム、その間にあるものすべてを含む評価スコープであるため。
    • Costly(高価) - すべての形式とモデルの組み合わせ(SoC + OS)について、認定を受けたラボで実際に評価作業をする必要があり、個々のテストは数百件にのぼるため。
    • Cumbersome(厄介) - かなり長い評価手続きで、初回は最長で 18 か月を要するため。

    ここ 3 年間は、OEM パートナーを対象に、この複雑さを軽減するための作業をしてきました。その結果、必要なセキュリティ要件を満たすために要求される機能が Android オープンソース プロジェクトに直接組み込まれることをお知らせします。さらに、すべての管理要件と監査要件を Android Enterprise Management フレームワークに追加しました。昨年は、このために開発したツールを GitHub に公開しました。他の Android OEM が認証(Certification)を受ける際に、この作業のメリットを活用できるようにするためです。

    新しい Android OS バージョンでの Pixel スマートフォンの認証(Certification)は継続しますが、Google はその他の Android OEM も、この認証(Certification)や、以下のその他の認証(Certification)を取得できるように取り組んでいます。

    • アメリカ国立標準技術研究所の Cryptographic Algorithm と Module Validation Programs。これは暗号アルゴリズムとモジュールの評価で、アメリカの公共部門やその他多くの規制のある業界で求められています。Android 11 では、Conscrypt の主要モジュールである BoringSSL がこの検証を終えています(認定番号 3753)。
    • アメリカ国防総省の Security Technical Implementation Guide(略称 STIG)。アメリカ国防総省のネットワークに技術を導入する方法をまとめたガイドラインです。かつては Android OEM に独自の実装や制御があったので、それによって異なる STIG が存在していましたが、Google の作業の成果によって、現在は 1 つの Android STIG テンプレートに統合されています。そのため、Android OEM は、さまざまな要件を満たすために独自の制御を作成する手間をかけずに済みます。

    今後も、企業とコンシューマの両方を対象にしたセキュリティ対策に注力してまいります。業界の皆さんがこの作業に加わってくれることを歓迎いたします。


    Reviewed by Eiji Kitamura - Developer Relations Team
    Share on Twitter Share on Facebook

    Android デバイスで Autofill with Google を有効にする方法は次のとおりです

    1. スマートフォンの [ 設定 ] アプリを開く
    2. [ システム ] > [ 言語と入力 ] > [ 詳細設定 ] をタップする
    3. [ 自動入力サービス ] をタップする
    4. [ Google 自動入力サービス ] をタップして設定を有効化する

    項目が見つからない場合は、こちらのページをご覧ください。デバイス メーカーから詳しい情報を得る方法が記載されています。

    動作の仕組み

    Google はユーザーのプライバシーを最優先に考えていますが、パスワードなどの機密データを扱う機能では特にそれを重視しています。Google 自動入力は Android の自動入力フレームワークがベースになっています。このフレームワークは、厳格かつ不変なプライバシーとセキュリティを遵守し、次の 2 つの場合にのみユーザーの認証情報にアクセスすることを保証します。1)ユーザーが Google アカウントに認証情報をすでに保存している場合。2)Android OS がユーザーに新しい認証情報を保存することを提案し、ユーザーがアカウントに認証情報を保存した場合。

    ユーザーが認証情報を操作したとき(フォームに認証情報を入力する、または初めて保存するとき)、Chrome で使われているものと同じプライバシー保護 API を使い、Google が追跡している既知の侵害されたパスワードのリストにその認証情報が含まれていないかを確認します。

    この実装では、以下の点が保証されています。

    この API の内部処理の詳細については、Chrome チームによるこちらのブログをご覧ください。

    その他のセキュリティ機能

    Google 自動入力は、Password Checkup の他にも、データの保護に役立つ機能を提供します。

    いつものように、プロダクト全般のセキュリティ向上に関する最新情報をお届けする Google Security ブログにご注目ください。


    Reviewed by Eiji Kitamura - Developer Relations Team
    Share on Twitter Share on Facebook


    注意事項: これは Chrome の動作の変更です。他のブラウザにも同様の機能が追加されることを期待しています。


    アプリで共有アイコンを表示しないようにする方法

    androidx.browser バージョン 1.3.0 以降では、CustomTabsIntent.BuildersetShareState() メソッドを使ってデフォルトの共有を無効にすることができます。

    val customTabsIntent = CustomTabsIntent.Builder()

            .setShareState(CustomTabsIntent.SHARE_STATE_OFF)

            .build();


    この変更の一環として、CustomTabsIntent.Builder の addDefaultShareMenuItem() メソッドと setDefaultShareMenuItemEnabled() メソッドは非推奨となっています。代わりに setShareState() を使うようにしてください。

    アプリでカスタムタブを使っている方は、ぜひフィードバックをお寄せください。こちらのフォームから連絡することができます。



    Reviewed by Eiji Kitamura - Developer Relations Team
    Share on Twitter Share on Facebook


    Android 開発の最新ニュースやトピックをご紹介する Now in Android。今回はKotlin と Jetpack の API、Navigation についての新コース、最近公開されたブログ記事・動画・関連ドキュメント、ポッドキャスト エピソードなどをご紹介します。


    最先端の Android 開発(MAD): Kotlin と Jetpack


    最先端の Android 開発に関する技術コンテンツを扱う連載シリーズ MAD Skills の新しいミニシリーズ Kotlin で Jetpack API を使用する が順調に進んでいます。最初のエピソードを紹介した前回以降、3 つのエピソードが追加されました。この 3 つのエピソードでは、大まかに言えば Room ライブラリと WorkManager ライブラリの使い方に関する情報をお届けしていますが、コルーチンなどの Kotlin 機能を使ってコードをシンプルにする具体的な方法にも触れています。

    Room Kotlin API の使用

    このエピソードでは、Florina Muntenescu が、Room Kotlin API を使ってローカル データベース ストレージ要件を実現し、それをテストする方法について説明します。



    ブログ記事(英語)でもご覧いただけます。


    WorkManager Kotlin API の使用


    このエピソードでは、Florina が WorkManager を使って非同期作業をスケジュールする方法を説明します。これは、すぐに実行することも、遅延実行することもできます。



    ブログ記事(英語)でもご覧いただけます。


    コミュニティ ヒント: Kotlin で開発のスピードと質を向上


    Android の Google Developer Expert の Magda Miu さんとチームメンバーは、Kotlin を使ってわかりやすく、メンテナンスしやすい CameraX のベンダー拡張機能を記述しています。その方法について動画で説明してくれました。



    Kotlin と Jetpack シリーズの締めくくりとして、1 月 15 日にからもう一度リアルタイム Q&A を開催しました。



    1 月 18 日の週から、新しい MAD Skills シリーズが始まっています。連載中のコンテンツは、YouTube の MAD Skills プレイリストMedium の記事、またはすべてのリンクが掲載されているランディング ページからご覧いただけます。


    Android トレーニング

    Android Basics in Kotlin コースに新しいユニット「Unit 3: Navigation」が追加されました。

    このユニットでは、Navigation コンポーネントAndroid アーキテクチャ コンポーネント ライブラリのその他の API に関するチュートリアルとサンプルを確認できます。


    その他の最近公開されたブログ記事と動画


    暗号と生体認証

    Isai Damier が暗号と認証、セキュリティについての新しい記事(英語)を公開しました。暗号に関するさまざまな興味深い背景を取り上げながら、暗号を利用した安全なソリューションで生体認証が用いられることが多い理由について説明しています。


    Kotlin の生産性

    Florina Muntenescu が、Kotlin を使えば生産性が上がるという記事を公開しました。既にたくさんの Kotlin コードを書いている方なら、おそらくご存知のことでしょう。しかし、仕事で Kotlin を使うべきか迷っている方や、プロジェクトの他のメンバーを説得する方法を探している方なら、この記事に書かれている具体的な内容が役立つかもしれません。


    RecyclerView で onClick() を扱う

    Meghan Mehta が RecyclerView に関する連載シリーズの第 3 回目のブログ記事(英語)を公開しました。RecyclerView でよくある要件の 1 つが、ユーザーのクリックへの対応です。リストの項目をクリックすれば、通常は何かが起こります。記事では、この機能を扱うおすすめの方法を紹介します。


    ADB (Android Developers Backstage) ポッドキャスト 新エピソード


    前回の Now in Android 以降、Android Developers Backstage に新しいエピソードが投稿されています。以下のリンクまたはお気に入りのポッドキャスト クライアントでご確認ください。

    ADB 154: It’s a Wrap!

    2020 年末、Tor NorbyeRomain Guy、そして私がこのエピソードを収録しました。昨年、それまでとは違う働き方を模索する中で起きたことや、Android のツールやプラットフォームの最新機能について解説しています。

     


    またお会いしましょう

    今回は以上です。次回も Android デベロッパーの世界の最新アップデートをお届けします。お楽しみに。


    Reviewed by Yuichi Araki - Developer Relations Team and Hidenori Fujii - Google Play Developer Marketing APAC

    Share on Twitter Share on Facebook

    Kotlin は簡潔なプログラミング言語として知られています。そしてそれは、高い生産性を意味します。そして実際に、Kotlin を使っている Android デベロッパーの 67% が、生産性が向上したと述べています。このブログ投稿では、Kotlin を使ってパートナーのエンジニアたちが生産性を向上させた方法をいくつか共有し、そのために役立つ Kotlin の機能も紹介します。


    簡潔さ、シンプルさと生産性

    レビューやメンテナンスの担当者は、読むコードが少なくなるので、コードが行っていることを理解しやすくなります。そのため、レビューやメンテナンスが楽になります。

    その一例として、Flipkart のチームを紹介しましょう。

    「弊社の社内調査によると、デベロッパーの 50% が、Kotlin でモジュールを書くと [機能を完成させるまでの] 見積りが小さくなると回答しました」(Flipkart)


    Kotlin の機能と生産性

    Kotlin の機能のほとんどは、簡潔さと高い可読性を持つため、高い生産性につながります。特によく使われる機能について見てみましょう。


    デフォルト引数とビルダー

    Java プログラミング言語では、コンストラクタのパラメータが省略可能な場合、一般的に次の 2 つの方法のどちらかを利用します。

    Kotlin ではデフォルト引数を利用できるので、どちらも必要ありません。デフォルト引数を使うと、ボイラープレートを追加することなく、関数のオーバーロードを実装できます。

    Cash App チームが Kotlin を使い始めたとき、多くのビルダーを削減し、書く必要があるコードの量を減らすことができました。場合によっては、コードのサイズが 25% 少なくなりました。

    たとえば、以下の一例は、 Task オブジェクトの実装で、タスクの名前のみが必須パラメータになっています。ビルダーを使った場合と、デフォルト引数を使った場合でそれぞれどうなるかを示しています。

    /* Copyright 2020 Google LLC.

       SPDX-License-Identifier: Apache-2.0 */


    - public class Task {

    -     private final String name;

    -     private final Date deadline;

    -     private final TaskPriority priority;

    -     private final boolean completed;

    -

    -     private Task(String name, Date deadline, TaskPriority priority, boolean completed) {

    -         this.name = name;

    -         this.deadline = deadline;

    -         this.priority = priority;

    -         this.completed = completed;

    -     }

    -

    -     public static class Builder {

    -         private final String name;

    -         private Date deadline;

    -         private TaskPriority priority;

    -         private boolean completed;

    -

    -         public Builder(String name) {

    -             this.name = name;

    -         }

    -

    -         public Builder setDeadline(Date deadline) {

    -             this.deadline = deadline;

    -         return this;

    -         }

    -

    -         public Builder setPriority(TaskPriority priority) {

    -             this.priority = priority;

    -             return this;

    -         }

    -

    -         public Builder setCompleted(boolean completed) {

    -             this.completed = completed;

    -             return this;

    -         }

    -

    -         public Task build() {

    -             return new Task(name, deadline, priority, completed);

    -         }

    -     }

    -}

    + data class Task(

    +     val name: String,

    +     val deadline: Date = DEFAULT_DEADLINE,

    +     val priority: TaskPriority = TaskPriority.LOW,

    +     val completed: Boolean = false

    +) 


    デフォルト引数の詳細については、連載シリーズ Kotlin Vocablary のブログ記事「Kotlin のデフォルト引数」をご覧ください。


    オブジェクトとシングルトン

    おそらく、シングルトン パターンはソフトウェア開発で特によく使われるパターンの 1 つでしょう。オブジェクトのインスタンスを 1 つだけ作成し、他のオブジェクトから共有してアクセスできるようにしたい場合に役立ちます。

    シングルトンを作るには、インスタンスが 1 つだけ存在するようにオブジェクトの作成方法を制御し、コードがスレッドセーフであることを保証する必要があります。Kotlin では、object キーワードだけでこれを実現できます。

     /* Copyright 2020 Google LLC.

       SPDX-License-Identifier: Apache-2.0 */

       

    - public class Singleton{

    -    private static volatile Singleton INSTANCE;

    -    private Singleton(){}

    -    public static Singleton getInstance(){

    -        if (INSTANCE == null) {                // Single Checked

    -            synchronized (Singleton.class) {

    -                if (INSTANCE == null) {        // Double checked

    -                    INSTANCE = new Singleton();

    -                }

    -            }

    -        }

    -        return INSTANCE;

    -    }

    -    private int count = 0;

    -    public int count(){ return count++; }

    - }


    + object Singleton {

    +     private var count = 0

    +     fun count(): Int {

    +         return count++

    +     }+ }

    演算子、文字列テンプレートなど

    Kotlin 言語の簡潔さとシンプルさは、演算子オーバーロード、分割代入、文字列テンプレートなどの機能から明らかです。そのため、コードはとても読みやすくなります。

    たとえば、本を集めたライブラリがあるとしましょう。ライブラリから本を取り出し、そのタイトルだけを出力する場合、コードは次のようになります。

    /* Copyright 2020 Google LLC.

       SPDX-License-Identifier: Apache-2.0 */


    fun borrow(){

        library -= book

        val (title, author) = book

        println("Borrowed $title")

    } 


    使われている Kotlin の機能は次のとおりです。


     

    まとめ

    Kotlin を使うと、コードは読みやすく、書きやすくなります。シングルトン委譲などのパターンが言語に組み込まれており、たくさんのコードを書く必要がないため、バグが紛れ込む確率が低くなり、メンテナンスの負荷も軽減されます。また、文字列テンプレートラムダ式エクステンション関数演算子オーバーロードなどの機能で、コードをさらに簡潔かつシンプルにできます。書くコードが少なくなれば、読むコードやメンテナンスするコードも少なくなり、エラーが減って生産性が上がります。


    詳しくは、Kotlin と Android Kotlin でより優れたアプリを作成するをお読みください。また、各社のケーススタディをご覧ください。デベロッパーにとっての Kotlin のメリットが確認できます。世界で特に好まれている開発言語の 1 つである Kotlin を使ってみたい方は、入門ページをご覧ください。

    Reviewed by Yuichi Araki - Developer Relations Team and Hidenori Fujii - Google Play Developer Marketing APAC
    Share on Twitter Share on Facebook