android-developersブログには、個々のアプリケーションのインストールを追跡する方法に関する小さなトピックが掲載されています。 誰かに役立つと思います。
インストールの追跡
開発者がアプリケーションの個々のインストールを追跡したい理由はたくさんあります。 TelephonyManager.getDeviceId()メソッドを呼び出し、この値を使用して個々のインストールを識別するものもあります。 これにはいくつかの問題があります。まず、IDの一意性は保証されません。 第二に、これが機能する場合でも、値はいわゆる「工場出荷時設定へのリセット」(すべての設定を初期設定にリセットする)を乗り切ることができます。その誰か。
設定を追跡するには、 UUIDを識別子として使用し、アプリケーションを初めて起動するたびに新しいUUIDを作成します。 以下は、1つの静的Installation.idメソッド(コンテキストコンテキスト)を持つInstallationクラスのスケッチです。 その後、すべてはあなたの想像力に依存します-さまざまなデバイス固有の情報をINSTALLATIONファイルに追加できます。
public class Installation { private static String sID = null; private static final String INSTALLATION = "INSTALLATION"; public synchronized static String id(Context context) { if (sID == null) { File installation = new File(context.getFilesDir(), INSTALLATION); try { if (!installation.exists()) writeInstallationFile(installation); sID = readInstallationFile(installation); } catch (Exception e) { throw new RuntimeException(e); } } return sID; } private static String readInstallationFile(File installation) throws IOException { RandomAccessFile f = new RandomAccessFile(installation, "r"); byte[] bytes = new byte[(int) f.length()]; f.readFully(bytes); f.close(); return new String(bytes); } private static void writeInstallationFile(File installation) throws IOException { FileOutputStream out = new FileOutputStream(installation); String id = UUID.randomUUID().toString(); out.write(id.getBytes()); out.close(); } }
デバイス識別
個々のデバイスに一意の識別子が必要だと想像してください。 いずれにしても、このタスクは簡単ではありません。
以前は、すべてのAndroidデバイスが電話の場合、すべてがシンプルでした。TelephonyManager.getDeviceId()メソッドは、一意であることが保証された電話のIMEI 、 MEID 、またはESNを返しました。
ただし、このアプローチでは多くの問題が発生します。
- 電話ではありません 。 Wi-Fiデバイスと音楽プレーヤーには電話機器が搭載されていないため、これらの識別子を提供することはできません。
- 永続性 。 電話モジュールが装備されているデバイスでは、これらの識別子はすべての設定がリセットされても変更されません。 そのため、アプリケーションは再インストールをカウントする必要がないことも考慮します。
- 追加の権利 。 READ_PHONE_STATEが必要です。これは、特にアプリケーションがテレフォニーを使用していない場合に顧客を悩ますものです。
- バグ 電話メーカーが識別子に従っていない場合があり、上記のメソッドはabracadabraを返します。
Macアドレス
BluetoothまたはWi-Fiを搭載したデバイスのMACアドレスを返してみることができます。 第一に、すべてのデバイスがWi-Fiを備えているわけではないため、これもお勧めしません。 次に、Wi-Fiモジュールがオンになっていない場合、MACアドレスを取得できません。
シリアル番号
Android 2.3(Gingerbread)から、 android.os.Build.SERIALを通じてシリアル番号を取得できます。 2.3より前のバージョンの場合、 lopatoidはコメントでメソッドを説明しました。
ANDROID_ID
より正確には、 Settings.Secure.ANDROID_IDです。 これは、デバイスの初回起動時に生成される64ビット値であり、デバイスのクリーニング時にリセットされます(ファクトリリセットなど)
基本的に、ANDROID_IDはデバイスの識別に適しています。 ただし、いくつかの欠点があります。まず、Androidバージョン2.2(Froyo)では100%信頼性がありません。 次に、電話メーカーの1つのよく知られたバグがあります。これは、すべてのデバイスに対して同じANDROID_IDが生成されたためです。
おわりに
ほとんどのアプリケーションでは、主なことはデバイスではなく単一のインストールを一意に識別することです。 幸いなことに、これは難しくありません。
個々のデバイスを識別することを避ける多くの理由があります。 まだ試してみたい人にとっては、おそらく最良の選択はANDROID_IDで、レガシーデバイス用の小さなヒューリスティックです。