2015-10-09 4 views
13

ユーザーの嗜好を管理するために、私は現在、ユーザー名(実際にはデバイスに登録した電子メールアドレス)を取得し、その「ハッシュ」を「ユーザーID」として使用して、ユーザー。記載されている行に沿った何かhereAndroid:怖い(ユーザー用)権限を必要とせずにユーザーIDを取得しますか?

これはすべてうまくいくが、一部のユーザーは、アカウント情報や連絡先を介してアプリに何らかの邪悪な威力を与えるような許可を与えることで(恐らく)怖がっている。

EDIT:この問題は、Googleが今やAndroid 6 runtime permissionスキーマにPermission Groupsを実装した方法によってさらに深刻です。彼らはGET_ACCOUNTSを許可グループCONTACTSに入れました。だから、ユニークな匿名ユーザIDを生成するには、

あなたの連絡先にアクセスすることを許可しますか? |拒否する|許可|

どのような誤解を招くのですか?私のアプリは連絡先にアクセスする必要はありませんが、ユーザーは連絡先にアクセスするためのアプリの許可を与えるよう求められています!はい、連絡先へのアクセスは必須ではありませんが、連絡先にアクセスする許可を与えるように依頼する株式システムのダイアログが表示されるという別のダイアログをユーザに説明する機会があります。 「連絡先へのアクセスが必要ない場合、なぜこの許可を与えるように求められているのですか? 「本当にデベロッパーを信頼しているのか?連絡先へのアクセスは必須ではないが、それは本当に本当ですか?」「非常に混乱し、非常に貧弱なユーザーエクスペリエンスIMHO(およびothers tooの意見)

私はむしろ、この手間と混乱を避け、特別な権限を必要とせずに一意のユーザーIDを取得したいと思います。

SDKには、追加の許可を必要とせずにユーザーの一意のユーザーIDを返すストック関数またはメソッドがありますか?もしそうでなければ、私はちょっと驚いている。なぜなら、アプリユーザーを管理するためのユーザーIDを持つことは、非常に一般的なことだと思われるからだ。

2点:

(a)は、私が唯一の匿名ユーザーIDが必要...私は実際にユーザの電子メールアドレスを必要としない、また私が今までユーザーの電子メールアドレスをしたいと思います。だから私はなぜGoogleがgetUserID()固有の匿名IDを返すメソッドを提供することができないのか分からない、アプリケーションに特別な権限を与えることなく。

(b)同じGoogleアカウントに登録されているすべてのユーザーのデバイスで機能するように、デバイスIDではなくユーザーIDである必要があります。

ありがとうございました。

+0

おそらくgcmidを使用できますか? –

+1

GCM IDは、ユーザーがGoogle Playサービスアプリのデータを消去した場合に変更される可能性があります。そうするとインターネットで読んで、アンドロイドソフトウェアの更新をスピードアップしたり、いくつかのバグを修正することができます。 –

+1

独自のデバイスid:http://stackoverflow.com/a/17625641/1048340もちろん、これは複数のデバイスを持つユーザーを考慮しません。これは許可なしで電子メールアドレスを取得するための良いオプションかもしれません:http://stackoverflow.com/a/19444640/1048340 –

答えて

6

Google Playサービスをご利用の場合は、追加の権限なしでアカウントの種類とアカウント名を取得できます。

まず、build.gradleには、以下の依存関係を追加します。

compile 'com.google.android.gms:play-services-auth:8.4.0' 

次に、アカウントチュー意図を起動します。

Intent intent = AccountPicker.newChooseAccountIntent(null, null, 
    new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, 
    false, null, null, null, null); 

try { 
    startActivityForResult(intent, REQUEST_CODE_EMAIL); 
} catch (ActivityNotFoundException e) { 
    // This device may not have Google Play Services installed. 
    // TODO: do something else 
} 

最後に、アカウントの種類とアカウント名を取得するためにonActivityResultをオーバーライドします。

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_CODE_EMAIL && resultCode == RESULT_OK) { 
    String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); 
    String accountType = data.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE); 
    // TODO: do something with the accountName 
    return; 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 

ソース:https://stackoverflow.com/a/19444640/1048340

+0

うーん、私は何かを明確にすることはできますか? [APIドキュメント](https://developers.google.com/android/reference/com/google/android/gms/common/AccountPicker.html)では、 'alwaysPromptForAccount'が' false'であれば選択するアカウントが複数ある場合、または呼び出し元のアプリケーションにGET_ACCOUNTS権限がない場合にのみ、アカウント選択画面が表示されます。また、GET_ACCOUNTS権限を要求したくありません。これは、アカウントが1つしかない場合でも、アカウント選択画面が常に表示されることを示しています。これは本当ですか? – snark

+0

私が尋ねる理由は、ユーザーのアプリ内購入をユーザーアカウントに関連付けるためです。現在、私はGET_ACCOUNTS権限を要求していますが、その要件を削除したいと思います。しかし、アカウントを1つしか持っていなくても、ユーザーのアカウントを毎回尋ねる必要があるように思えます。これは、連絡先のアクセス許可を一度しか求めない場合よりも、さらに悪いユーザーエクスペリエンスです。 – snark

+0

上記のコードを単純なテストアプリに入れて、自分の質問に答えることができます。はい、アプリがGET_ACCOUNTS権限を持たない場合にアカウントを1つしか持たない場合は、アカウントピッカーが毎回表示されます。もちろん、返されたアカウント名を保存することはできますが、変更しないと仮定する必要があります。これは安全な前提ではありません。[ユーザーが端末でアカウントを変更するとアプリがインストールされたままになる] //android.stackexchange.com/a/24484/155892)。したがって、このようなアカウント選択ツールを使用することは、アプリ内購入の場合には実行可能な解決策ではありません。 – snark

-1

残念ながら、最も基本的なアカウントアクセスでもユーザーの許可が必要な場合でも、解決策はありません。

+0

** AccountPicker **にはアクセス許可が必要ありません。あなたはこれを見ましたか?https://developers.google.com/android/reference/com/google/android/gms/common/AccountPicker –

0

あなたはUUIDとして、Googleの広告IDを使用することができますが、それはクロスデバイスではありません(まだ?):

https://support.google.com/googleplay/android-developer/answer/6048248?hl=en

少なくとも怖い許可要求を取り除くでしょう。

GoogleのDoubleclickが開発したと思われるが、Android/Googleに許可が必要ないクロスデバイスUUIDがあるとは思わない。

+0

〜「権限を必要としない**機器間UUID **」 AccountPickerはパーミッションを必要とせず、複数のデバイスに同じユーザーIDを表示します。 –

2

あなたは権限を追加する必要なくAccountPickerを使用して、正確なGmailのメールアドレスを得ることができます。

アプリは、Google Playのサービスを含める必要がありますが、それは 任意の権限を必要としません。

は、Androidの古いバージョンでは失敗します。このプロセス全体(2.2 +は 必要です)やGoogle Playが利用できない場合ので、あなたは そのケースを考慮する必要があります。

ソースからのサンプルコード:

private static final int REQUEST_CODE_EMAIL = 1; 
    private TextView email = (TextView) findViewById(R.id.email); 

    // ... 

    try { 
     Intent intent = AccountPicker.newChooseAccountIntent(null, null, 
       new String[] { GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE }, false, null, null, null, null); 
     startActivityForResult(intent, REQUEST_CODE_EMAIL); 
    } catch (ActivityNotFoundException e) { 
     // TODO 
    } 

    // ... 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == REQUEST_CODE_EMAIL && resultCode == RESULT_OK) { 
      String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); 
      email.setText(accountName); 
     } 
    } 

上記情報のソースがある:This Answer on SO - 過去に尋ね似ていますが、わずかに異なるの質問に。

This Post - あなたの目的に役立つ素晴らしいアプローチもあります。

関連する問題