Secure.ANDROID_IDはデバイスごとに一意ですか?


81

私はこの呼び出しを使用しています:

Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID);

デバイスのUIDを取得します。ただし、複数のデバイスから同じIDを取得していると思います。これは可能でしょうか?

問題のIDは9774d56d682e549cであり、このIDを返すいくつかのデバイスに問題があるようですhttp://code.google.com/p/android/issues/list?cursor=10603&updated=10603&ts=1295993403


問題のIDを調べて、それに関するスレッドを見た後、私は確信しています。最初は、デバイスがnullを返している可能性があると思い、デフォルトとしてどこかに入れていました。しかし、そうではありません。複数のデバイスで同じ値を取得していることは確かです。
FoamyGuy 2011年

1
私は完璧だと思いました:stackoverflow.com/a/16929647/1318946
Pratik Butani 2014

一意でない場合は、Identity.getDeviceId(context)に付属しているこのライブラリを使用しください。
caw 2015年

回答:


47

このスレッドにチェックインします。ただし、「出荷時設定へのリセット時に変更される可能性がある」と記載されているため、注意が必要です。ご自身の責任で使用してください、そしてそれは根ざした電話で簡単に変えることができます。また、一部のメーカーでは、電話番号のスレッドが重複しているという問題が発生しているようです。あなたがやろうとしていることに応じて、私はおそらくこれをUIDとして使用しないでしょう。


19
ANDROID_IDの実装がとても...ラメだというのは残念です!Googleの文書から判断すると、その意図は長持ちIDた: A 64-bit number (as a hex string) that is randomly generated on the device's first boot and should remain constant for the lifetime of the device
誰かどこか

3
このスレッドリンクに よると、 「また、大手メーカーの人気のある携帯電話には、すべてのインスタンスが同じANDROID_IDを持つ、広く観察されているバグが少なくとも1つあります。」 使用しない方がよい
Muhammad Riyaz 2016

2
それはフローズンヨーグルトの2011年からでした。今は関係ありません。
オーブティンサマイ2016

デバイスのバックアップ/復元またはデバイスのクローン作成についてはどうですか?同じANDROID_IDを持つ可能性について何か考えはありますか?もちろん、デバイスがルート化されていないと仮定します。
FunkSoulBrother 2018年

39

Android Oでは、ANDROID_IDの動作が変わります。ANDROID_IDは、電話のユーザーごとにアプリごとに異なります。

取得元:https//android-developers.googleblog.com/2017/04/changes-to-device-identifiers-in.html

Android ID

Oでは、Android ID(Settings.Secure.ANDROID_IDまたはSSAID)は、デバイス上のアプリごとおよびユーザーごとに異なる値を持ちます。デバイススコープの識別子が必要な開発者は、代わりにAdvertising IDなどのリセット可能な識別子を使用して、ユーザーがより細かく制御できるようにする必要があります。Advertising IDは、広告の追跡を制限するためのユーザー向けの設定も提供します。

さらにAndroidOの場合:

  • ANDROID_IDの値は、パッケージ名と署名キーが同じである限り、パッケージのアンインストール/再インストール時に変更されません。アプリはこの値に依存して、再インストール後も状態を維持できます。
  • 以前のバージョンのAndroidを実行しているデバイスにアプリがインストールされている場合、アプリをアンインストールして再インストールしない限り、デバイスがAndroidOに更新されてもAndroidIDは同じままです。
  • Android IDの値は、デバイスが出荷時設定にリセットされている場合、またはアン
    インストールイベントと再インストールイベントの間で署名キーが回転する場合にのみ変更されます。
  • この変更は、GooglePlay開発者サービスとAdvertisingIDを同梱しているデバイスメーカーにのみ必要です。他のデバイスメーカーは、代替のリセット可能なIDを提供するか、ANDROIDIDを提供し続ける場合があります。

ありがとう。デバイスIDによって報告された(md5'ed)IDを使用して妻の電話でテスト広告が表示されなかった理由と、これがadb shellsettingsコマンドで報告された値と一致しない理由を理解しようとして髪を引っ張っていました。 ..私は夢中になっていると思った。
ECV

15

あなたは、デバイス自体に固有の何かをしたいのであれば、TM.getDeviceId() 必要があります十分で。

テレフォニーマネージャIDを取得する方法を示すコードは次のとおりです。使用しているAndroidデバイスIDは出荷時の設定で変更される可能性があり、一部のメーカーでは一意のIDの付与に問題があります。

TelephonyManager tm = 
        (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String androidId = Secure.getString(this.getContentResolver(), Secure.ANDROID_ID);
Log.d("ID", "Android ID: " + androidId);
Log.d("ID", "Device ID : " + tm.getDeviceId());

TelephonyManagerを使用して許可を取得してください

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

3
はい、getDeviceId()の使用も機能します。ただし、nullが返される可能性があるため、十分に注意する必要があります。(3g /電話モデムのないデバイスの場合)私が使用する解決策は、Wifiの
MAC

19
READ_PHONE_STATE許可を必要とするのはひどいです。ANDROID_ID代わりに使用してください。
ドルメン

ええ、それは3gのないデバイス(市場にたくさんある)でnullを返すかもしれません、そしてあなたはWiFiを使うべきです-デバイスの再起動後に少なくとも一度それをオン/オフにするまでそのGUIDもnullかもしれません。そして、wifiがない場合...本当の悪夢、Windows CEには、各デバイスのGUIDがあり、人生は美しいものでした。
marcinj 2012年

何千ものリクエストの後で、IMEIであるデバイスIDが偽のデバイスに複製される可能性があることが判明したため、完全なソリューションではありません。フォールバックとしてgetSimSerialNumberとANDROID_IDを使用するように戻しています。
アジボラ2015

Android 10(APIレベル29)は、IMEIとシリアル番号の両方を含むリセット不可能な識別子の制限を追加します。このTM.getDeviceId()アプローチを実装する前に、まずAndroid> = 10デバイスでのデバイス識別子の新しい権限要件を確認してください。
エゼキエルセバスチン

6

私はこれについていくつか読んだことがありますが、残念ながら、個々のデバイスを一意に識別するためにANDROID_IDに依存するべきではありません。

Androidのコンプライアンス要件では強制されていないようであるため、メーカーは、「モデル」IDなどとして使用するものも含め、選択した方法で実装しているようです。

また、メーカーがジェネレーターを作成してUUIDにする場合でも(たとえば)、出荷時設定へのリセット後も存続する保証はないことに注意してください。


6
設計による出荷時設定へのリセットに耐えられないことが保証されていると思います。ドキュメントのどこかに記載されています。そして、それはそれを実装する正しい方法です。
バイオレットキリン2016年

では、どうすればGUIDを生成できますか?
IgorGanapolsky

6

複数の解決策が存在しますが、どれも完璧ではありません。一つずつ行きましょう。

1. Unique Telephony Number (IMEI, MEID, ESN, IMSI)

  • このソリューションでは、ユーザーにandroid.permission.READ_PHONE_STATEをリクエストする必要があります。これは、作成したアプリケーションの種類に応じ て正当化するのが難しい場合があります。

  • さらに、タブレットにはテレフォニーサービスがないため、このソリューションはスマートフォンに限定されています。1つの利点は、値がデバイスの工場出荷時のリセットまで存続することです。

2. MAC Address

  • Wi-FiまたはBluetoothハードウェアを搭載したデバイスからMACアドレスを取得することもできます。ただし、すべてのデバイスにWi-Fi接続があるわけではないため、このソリューションはお勧めしません。ユーザーがWi-Fi接続を使用している場合でも、データを取得するにはWi-Fi接続をオンにする必要があります。それ以外の場合、呼び出しはMACアドレスを報告しません。

3. Serial Number

  • タブレットなどのテレフォニーサービスのないデバイスは、Android 2.3Gingerbread以降のandroid.os.Build.SERIALを介して利用できる一意のデバイスIDを報告する必要があります。テレフォニーサービスを備えた一部の電話では、シリアル番号を定義することもできます。すべてのAndroidデバイスにシリアル番号があるわけではないように、このソリューションは信頼できません。

4. Secure Android ID

  • デバイスの最初の起動時に、ランダムな値が生成されて保存されます。この値は、Settings.Secure.ANDROID_IDから入手できます。これは64ビットの数値であり、デバイスの存続期間中は一定である必要があります。ANDROID_IDは、スマートフォンやタブレットで利用できるため、一意のデバイス識別子に適しているようです。

    String androidId = Settings.Secure.getString(getContentResolver(),Settings.Secure.ANDROID_ID);
    
  • ただし、デバイスで出荷時設定へのリセットを実行すると、値が変わる場合があります。すべてのインスタンスが同じANDROID_IDを持つメーカーの人気のある携帯電話には、既知のバグもあります。明らかに、このソリューションは100%信頼できるものではありません。

5. Use UUID

  • ほとんどのアプリケーションの要件は、物理デバイスではなく特定のインストールを識別することであるため、UUIDクラスを使用する場合は、ユーザーの一意のIDを取得するための優れたソリューションです。次のソリューションは、GoogleのRetoMeierによってGoogleI / Oプレゼンテーションで提示されました。

    private static String uniqueID = null;
    private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
    public synchronized static String id(Context context) {
       if (uniqueID == null) {
           SharedPreferences sharedPrefs = context.getSharedPreferences(
                   PREF_UNIQUE_ID, Context.MODE_PRIVATE);
           uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null);
           if (uniqueID == null) {
               uniqueID = UUID.randomUUID().toString();
               Editor editor = sharedPrefs.edit();
               editor.putString(PREF_UNIQUE_ID, uniqueID);
               editor.commit();
           }
       }    return uniqueID;
    }
    

Androidで特定のデバイスを特定するのは簡単なことではありません。それを避ける理由はたくさんあります。最善の解決策は、おそらくUUIDソリューションを使用して特定のインストールを識別することです。クレジット:ブログ


1

ここに代替ソリューション、広告IDをリストしてください。

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

上記のリンクからコピー:

広告IDは、GooglePlay開発者サービスによって提供される広告用の一意のユーザーリセット可能なIDです。これにより、ユーザーはより適切に制御でき、開発者はアプリの収益化を継続するためのシンプルで標準的なシステムを利用できます。これにより、ユーザーはIDをリセットしたり、Google Playアプリ内のパーソナライズされた広告(以前はインタレストベース広告と呼ばれていました)をオプトアウトしたりできます。

制限は次のとおりです。

  1. GooglePlay対応デバイスのみ。
  2. 個人情報保護方針: https://support.google.com/googleplay/android-developer/answer/113469?hl=en&rd=1#privacy

これは、Google Play(サービス)を備えていない電話でも機能しますか?
マックスウォーターマン

これはGUIDではありません
IgorGanapolsky

0
//Fields
String myID;
int myversion = 0;


myversion = Integer.valueOf(android.os.Build.VERSION.SDK);
if (myversion < 23) {
        TelephonyManager mngr = (TelephonyManager) 
getSystemService(Context.TELEPHONY_SERVICE);
        myID= mngr.getDeviceId();
    }
    else
    {
        myID = 
Settings.Secure.getString(getApplicationContext().getContentResolver(), 
Settings.Secure.ANDROID_ID);
    }

はい、Secure.ANDROID_IDはデバイスごとに一意です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.