web-dev-qa-db-ja.com

android device id confusion

ダイヤルした場合 *#*#8255#*#* 、私はAndroid _Android-__35c2acdd..._で始まるデバイスIDを取得します

source ソース

Settings.Secure.getString(getContentResolver(), Settings.Secure.Android_ID)を使用すると、結果は_a96b4b27..._で始まります

_((TelephonyManager) Context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId()_を使用すると、結果は_3538330..._で始まります

これらのIDの違いは何ですか?どうすれば結果を取得できますか

*#*#8255#*#* ダイヤル?

43

[〜#〜] imei [〜#〜]

IMEIは、テレフォニーモジュールの「 [〜#〜] mac [〜#〜] 」です。電話がGSM/GPRS/HSPDA/etcを介して接続するときに使用する一意のIDです。 GSMネットワークはそれを使用して、電話からの通話とデータをGSMネットワーク経由でインターネット(IPネットワーク)へのゲートウェイまでルーティングします。

テレフォニーモジュールは、GSMまたはCMDAのいずれかの電話ネットワークを処理するチップまたは回路基板であり、多くの場合、リムーバブルSIMカード用のスロットがあります。一部の電話には、複数のテレフォニーモジュールがあります(アクティブなデュアルまたはマルチSIM電話)。各テレフォニーモジュールには、独自のIMEIがあります。

製造業者は、製造中に各電話(厳密にはテレフォニーモジュール)に一意のIMEIを提供します。ただし、適切なソフトウェアを使用している場合、通常は番号を書き換えることができます。これは、多くの場合、電話が盗まれた後に行われ、電話に新しいIDおよびバイパス盗難電話ブロックシステムが付与されます。

IMEIは、 TelephonyManager.getDeviceId() APIを使用してプログラムで取得できます。

CDMA電話には、同じAPIを使用して取得された場合でも、ESNまたはMEIDがあり、これらは 異なる長さと形式 です。

テレフォニーモジュールのないAndroidデバイス-たとえば、多くのタブレットやTVデバイス-にはIMEIがありませんSchlangi がコメントされているように、テレフォニーモジュールfakeIMEIを持たない一部のデバイスは、IMEIの存在が(常に)デバイスを保証しないテレフォニーモジュールがあります。

Android_ID

Android_IDは、携帯電話の別の一意の番号です。これは、OSが初めて起動するときに自動的に生成されます(この方法で行うと、製造元にとってmuch生産ラインからのステップ)。

Android_IDは変更できます(実際に変更されます)。例えば:

主に開発者が使用します(例:adbを使用したデバイスの識別と接続)

Android_IDを使用して、Android上記の警告が与えられたデバイスを識別できます。現実的には、デバイスの寿命のかなりの部分でデバイスを一意に識別しますが、信頼できません。

また、多くのデバイスがsameAndroid_IDを与えたFroyoにバグがあったことに注意してください。これは bug です

その他の識別子

デバイスを識別するために使用できる他の多くのものがあります:

  • WiFiモジュールのMACアドレス: WifiManager.getConnectionInfo() -> WifiInfo.getMacAddress() 多くの場合、これはソフトウェアで変更できますが、一般的にはデバイスの寿命全体にわたって一定です。また、WiFiモジュールがオンになっている場合にのみ読み取ることができます。
  • BlueToothモジュールのMACアドレス: BluetoothAdaptor.getAddress() 。 WiFi MACと同様に、これはソフトウェアで変更されることが多く、必要なときにオフになる場合があります
  • 加入者の電話番号。これは、ユーザーが電話会社に新しい番号を要求した場合、またはユーザーがSIMを切り替えた場合に変更される可能性があります。 TelephonyManager.getLine1Number() から取得されます。これは、Android現在のSIMがインストールされ、電話会社との有料サービスを備えた電話デバイスにのみ存在します。
  • SIMには独自の識別番号が含まれています( [〜#〜] imsi [〜#〜] )。これは TelephonyManager.getSubscriberId() APIから取得されます。明らかに、SIMは特定の時間に存在しない場合があり、SIMが変更されると変更されます-ユーザーは同じ番号を維持しながらSIMをアップグレード/交換できるため、これは1対1とは言えません特定の電話またはユーザー。
  • IMSIに関連するのは、 [〜#〜] msisdn [〜#〜] です。これは、subscription(モバイルプロバイダーとの特定の電話番号の契約)の識別として機能するため、デバイスに電話番号を提供します。 MSISDNは複数のSIMカード、したがって複数の電話に関連付けられている場合があります。上記のSIMを読むためのすべての警告が付属しています。これは TelephonyManager.getSimSerialNumber() で取得できます。感謝 Schlangi 修正と追加について
  • Gingerbread以降には Android.os.Build.SERIAL があり、多くのメーカーが設定しています(すべてではありません。Bugger)。

その他の注意事項

すべてのAPIにアクセスするには特定のアクセス許可が必要です。したがって、すべてのAPIにアクセスしようとすると、Google Playストアでのアプリのアクセス許可はかなり寛容に見えます。

このリンクは他のすべての利用可能なオプションも説明していると思います https://Android-developers.googleblog.com/2011/03/identifying-app-installations.html

81
Andrew Alcock

ウェブで発見:

private static final Uri URI = Uri.parse("content://com.google.Android.gsf.gservices");
private static final String ID_KEY = "Android_id";

String getAndroidId(Context ctx) {
    String[] params = { ID_KEY };
    Cursor c = ctx.getContentResolver()
            .query(URI, null, null, params, null);

    if (!c.moveToFirst() || c.getColumnCount() < 2)
        return null;

    try {
        return Long.toHexString(Long.parseLong(c.getString(1)));
    } catch (NumberFormatException e) {
        return null;
    }
}

許可を追加:

<uses-permission Android:name="com.google.Android.providers.gsf.permission.READ_GSERVICES"/>

ただし、これが文書化されたIDであるとは思わず、GTalkが更新された場合には機能しない可能性があるため、注意が必要です。

ソース: http://blog.codepainters.com/2012/01/17/how-to-obtain-gtalk-Android-id/

また、一見する価値があります: http://www.toxicbakery.com/Android-development/getting-google-auth-sub-tokens-in-your-Android-applications/

8

Android電話で一意の識別子を取得する方法がいくつかあります。

  1. Android IDこれは、デバイスの最初の起動時に生成される64ビットの16進文字列です。通常、工場出荷時設定にリセットしない限り、変更されません。

    Secure.getString(getContentResolver()、Secure.Android_ID);

Android IDは、nullになることがあるため信頼できないと見なされます。ドキュメントには、「工場出荷時のリセット時に変更できる」と記載されています。この文字列はルート化された電話でも変更できます。

   String m_szAndroidID = Secure.getString(getContentResolver(), Secure.Android_ID);

Returns: 9774d56d682e549c . No special permissions required.

2. WLAN MACアドレス文字列は、デバイスIDとして使用できる別の一意の識別子です。読む前に、プロジェクトにAndroid.permission.ACCESS_WIFI_STATE権限があることを確認するか、WLAN MACアドレスがnullになることを確認する必要があります。

 WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
 String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();
Returns: 00:11:22:33:44:55 (not a real address since this is a custom ROM , as you can see the MAC address can easily be faked).
WLAN doesn't have to be on, to read this value.

3. Android Bluetooth対応デバイスで利用可能なBT MACアドレス文字列は、プロジェクトにAndroid.permission.BLUETOOTH権限がある場合に読み取ることができます。

    BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter
    m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
   String m_szBTMAC = m_BluetoothAdapter.getAddress();

戻り値:43:25:78:50:93:38 BTを読むためにオンにする必要はありません。 4. IMEIは、Android電話使用のデバイスのみ:

 TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
 String szImei = TelephonyMgr.getDeviceId(); // Requires READ_PHONE_STATE

これには、AndroidManifest.xmlに権限を追加する必要があります。ソフトウェアをインストールすると、ユーザーに通知されます:Android.permission.READ_PHONE_STATE。 IMEIはお使いの携帯電話に固有のもので、359881030314356のように見えます(0000000000000などの無効なIMEIを備えたプリプロダクションデバイスがない場合)。詳細情報 参照 このリンク。

5
neeraj t

IMEI

標準化団体による必須要件があり、パブリックネットワークのモバイルデバイスはIMEI番号によって一意に識別される場合があります

IMEIを設定するのは製造元の責任です。実際には、開発者は000000 ...や123456 ...のようなIMEIを見ることがあります...同じIMEIの電話が実稼働することもありますが、これはshouldが修正されるバグです...

Android_ID

デバイスの初回起動時にランダムに生成され、デバイスのライフタイム中は一定のままである64ビット数(16進文字列として)。(デバイスで工場出荷時設定へのリセットが実行されると、値が変更される場合があります。 )

Androidはメーカーを信頼せず、代替の一意のIDを提供します。

編集:

これは私が(IMEIの代わりに)得るものであり、Androidデバイスであるではない電話:

$ adb Shell dumpsys iphonesubinfo
Phone Subscriber Info:
  Phone Type = GSM
  Device ID = null

上記のすべての情報は、コードを理解するのに十分だと思います。

それでも、あなたはまだ「#8255#dial "(これを理解するのにどこか間違ったことがあるとすればすみません)

この背後にある理由は、Androidで作成されたUSSDコードに対する最新のバグ修正の1つであると思います。 (これについて詳しく読んで、デバイスがリストに載っているかどうかを確認してください。Web全体で)

最後に、Android IDをすぐに取得したい場合は、このアプリを使用することをお勧めします-

https://play.google.com/store/apps/details?id=com.redphx.deviceid&hl=en

1
pragmatic