ユーザーを記憶する

名前を覚えてもらっていると、うれしいものです。アプリを愛用してもらうためにできる最も簡単で効果的な方法の一つは、ユーザーを覚えておくことです。ユーザーが新しいデバイスにアップグレードしたり、タブレットとスマートフォンを使い始めたりした場合は特にそうです。しかし、ユーザーが誰であるかをどうやって知ればよいのでしょうか。新しいデバイスで どうやって認識するのでしょうか

多くのアプリにとって、AccountManager API がその答えになります。ユーザーが許可すれば、アカウント マネージャーを使用して、ユーザーがデバイスに保存しているアカウント名を取得できます。

ユーザーのアカウントと統合すると、次のようなさまざまなことが可能になります。

  • ユーザーのメールアドレスをフォームに自動入力します。
  • デバイスではなくユーザーに関連付けられている ID を取得します。

AccountManager が適しているかどうかを判断する

アプリがユーザーを記憶する際、通常は次の 3 つの手法のいずれかを使用します。

  1. ユーザー名の入力をユーザーに依頼します。
  2. 一意のデバイス ID を取得して、デバイスを記憶する
  3. AccountManager から組み込みアカウントを取得します。

方法 1 には問題があります。まず、アプリを使用する前に入力を求めるメッセージが自動的に表示されると、アプリの魅力が低下します。次に、選択したユーザー名が一意である保証はありません。

オプション(2)はユーザーにとってそれほど面倒ではありませんが、正しく行うのは困難です。さらに重要なこととして、1 台のデバイスでのみユーザーを記憶できます。輝く新しいデバイスにアップグレードした人が、自分のアプリがデバイスを忘れてしまっていることに苛立ちを覚えることを想像してみてください。

方法 3 がおすすめの方法です。アカウント マネージャーを使用すると、ユーザーのデバイスに保存されているアカウントに関する情報を取得できます。アカウント マネージャーを使用すると、UI に数回タップするだけで、ユーザーが所有しているデバイス数に関係なく、ユーザーを記憶できます。

使用するアカウントのタイプを決定する

Android デバイスでは、さまざまなプロバイダの複数のアカウントを保存できます。AccountManager でアカウント名をクエリする場合、アカウント タイプでフィルタすることもできます。アカウント タイプは、アカウントを発行したエンティティを一意に識別する文字列です。たとえば、Google アカウントのタイプは com.google ですが、Twitter では com.twitter.android.auth.login が使用されます。

GET_ACCOUNTS 権限をリクエストする

デバイス上のアカウントのリストを取得するには、アプリに GET_ACCOUNTS 権限が必要です。マニフェスト ファイルに <uses-permission> タグを追加して、この権限をリクエストします。

<manifest ... >
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    ...
</manifest>

ユーザーに通知して同意を得る

ユーザー アカウントのリストを取得するには、getAccounts() または getAccountsByType() を呼び出します。ただし、API はユーザーの個人情報や機密情報を返すため、アプリが個人情報や機密情報にアクセス、収集、使用、共有する場合は、必ずその事実をユーザーに明確に開示する必要があります。Google Play で公開するアプリの場合、ユーザーデータを保護するポリシーでは、次のことを行う必要があります。

  1. アプリが個人情報や機密情報に対して、そのアクセス、収集、使用、共有の方法を開示する。詳しくは、許可される開示と同意に関する記事をご覧ください。
  2. このデータをデバイス内外でどのように使用するかを記載したプライバシー ポリシーを提供してください。

詳しくは、ユーザーデータに関する Google Play ポリシーをご覧ください。

アカウントのリストを AccountManager に照会する

目的のアカウントの種類が決まったら、そのタイプのアカウントをクエリする必要があります。AccountManager.get() を呼び出して、AccountManager のインスタンスを取得します。次に、そのインスタンスを使用して getAccountsByType() を呼び出します。

Kotlin

val am: AccountManager = AccountManager.get(this) // "this" references the current Context

val accounts: Array<out Account> = am.getAccountsByType("com.google")

Java

AccountManager am = AccountManager.get(this); // "this" references the current Context

Account[] accounts = am.getAccountsByType("com.google");

Account オブジェクトの配列が返されます。配列に複数の Account がある場合は、ユーザーに 1 つを選択するよう求めるダイアログを表示します。

アカウント オブジェクトを使用してアプリをパーソナライズする

Account オブジェクトにはアカウント名(Google アカウントの場合はメールアドレス)が含まれます。この情報は、次のような複数の方法で使用できます。

  • フォームの候補として表示。これにより、ユーザーがアカウント情報を入力する必要がなくなります。
  • 使用状況やパーソナライズに関する情報を集めた独自のオンライン データベースへのキーとして使用する。

アカウント名で十分かどうかを判断する

アカウント名はユーザーを記憶するのに適した方法ですが、Account オブジェクトだけでは、データが保護されず、ユーザーのアカウント名以外に対するアクセス権も付与されません。アプリでユーザーをオンラインにしてプライベート データにアクセスする必要がある場合は、より強力な認証機能が必要です。既存のオンライン サービスに対する認証方法カスタム認証システムの作成方法を確認して、独自のアカウント タイプをインストールできるようにする。