一部の開発者は、ユーザーのAndroidデバイスを識別する必要がある場合があります。 ほとんどの場合、これはデバイスを認識するためではなく、アプリケーションの特定のインストールを決定するために行われます。 また、開発者が複数のアプリケーションを使用していて、それらが同じ環境で動作することを理解したい場合、必要な場合にもいくつかのケースに遭遇しました。
Googleは 、デバイスの識別は簡単だと言います。 しかし、私たちはAndroidについて話している:)
この記事では、Googleサービスに接続したくないアプリケーションまたはライブラリに焦点を当てています。
それでは、ユニークなデバイス識別子を取得するという素晴らしい冒険に飛び込みましょう。
ここにいくつかの方法があります:
- 広告ID
- IMEI
- MACアドレス
- シリアル番号
- Android ID
今のところ見た目は悪くないですか? Androidデバイスの一意の識別子を取得する最大5つの方法。 ネットワーク上でまだ音がする場合は、他にも2、3の方法がきっと見つかるはずですが、ここでは最も人気のある方法を作成しました。 それでは、順番に行きましょう。
広告ID
これは、Google Play開発者サービスによって提供される一意の広告識別子です。 特定のユーザーに表示できる広告と、アプリケーションに組み込まれた広告バナーを使用して既に表示されている広告をGoogleが理解できるように、広告が機能する必要があります。 また、これは、たとえばAmazonからアプリケーションをダウンロードすると、この識別子が失われることを意味します。さらに、 Googleライブラリをアプリケーションにドラッグする必要があります。
dependencies { compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.google.android.gms:play-services:6.5.87' }
結論:すべての場合にデバイスを識別するわけではありません。
しかし、私たちは確かに欲しいですよね? 次に進みます。
IMEI
これは、GSM電話で使用されるモバイル機器の国際的な識別子です。 IMEI番号は、ネットワークを使用してスマートフォンを識別し、盗難またはブラックリストに登録されたデバイスのネットワークへのアクセスをブロックします。 しかし、残念ながらIMEIでは多くの問題が発生する可能性があります。
- 無効なIMEIエラーが発生する
- IMEIは変更可能
- IMEIを取得するには、許可が必要です。
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { String imei = telephonyMgr.getImei(); } else { String imei = telephonyMgr.getDeviceId(); }
結論:すべての場合にデバイスを特定するわけではなく、彼らは私たちを欺くこともできます:C
MACアドレス
100%信頼できるわけではありません。 Google自身がこれについて語っていますが、残念ながら、デバイスのMACアドレスに依存するいくつかのアプリケーションに出会いました。 そうしないでください。
デバイスのWiFiまたはBluetoothハードウェアからMacアドレスを取得できる場合があります。 これを一意の識別子として使用することはお勧めしません。 まず、すべてのデバイスにWiFiがあるわけではありません。 また、WiFiがオンになっていない場合、ハードウェアはMacアドレスを報告しない場合があります。
シリアル番号
これは、デバイスの一意のシリアル番号と見なされ、「非常に最後まで」保持されます。 次の方法で取得できます。
//Until Android 7.1 (SDK 25) Build.SERIAL //Android 8 (SDK 26) ++ Build.getSerial()
そして今、問題について。 まず、シリアル番号を取得するには、ユーザーにREAD_PHONE_STATEの許可を求める必要があります。ユーザーは拒否することができます。 次に、シリアル番号を変更できます 。
結論:すべての場合にデバイスを特定するわけではありません。ユーザーをだまし、それでも私たちを欺くことができるユーザーに許可を要求する必要があります。
Android ID
-これだ! -私たちは叫ぶ必要があります。 -すべてのトラブルの解決策!
Android IDは一意のデバイス識別子でもあります。 これは、デバイスの最初の起動時に生成および保存される64ビット値です。
次のように取得できます。
Secure.getString(getContentResolver(), Secure.ANDROID_ID);
そのような短い行は、デバイスを識別する際の頭痛から私たちを救うように思えます。 この例では、グーグルの男性でさえLVLにAndroid_IDを使用しています。
そして、ここで私たちの希望は崩れつつあり、何も同じではありません。 Android 8に更新した後、 Android_IDはインストールされたアプリケーションごとに一意になりました。 しかし、これに加えて、Googleは私たちのことを気にかけているので、更新前にインストールされたアプリケーションは、このために特別に作成されたサービスを使用してGoogleが保存する識別子と同じままです。 ただし、アプリケーションをアンインストールしてから再インストールすると、Android_IDは異なります。 これを防ぐには、KeyValueBackupを使用する必要があります。
ただし、このバックアップサービスと、指定するパッケージ名を登録する必要があります。 さらに、ドキュメントには、これが何らかの理由で機能しない可能性があることが記載されています。 そして誰が責任があるのでしょうか? 誰もいません
一般的な結論
優れたバックエンドがある場合は、デバイスのナゲット(インストールされているアプリケーション、サービス、取得可能なデバイスに関するデータ)を収集し、そこにあるパラメーターを比較します。
PS私はすべてのコレクションを電報チャンネル@paradisecurityでいつものように公開しています。リンクは私のプロフィールで見つけることができます。または名前による電報の検索で見つけることができます。
ハッピー:)