web-dev-qa-db-ja.com

Android一意のシリアル番号

私はAndroidを対象とするアプリケーションを開発していますAndroid 4.0(API 14)以上。

デバイスごとに一意であり、永続的なシリアル番号を探しています(デバイスと一緒に死んでも、工場出荷時のリセット後も変更されません)。

Androidデバイスの一意の識別子に関するWeb上で多くの結果を見つけましたが、Android.os.Build.SERIAL番号。

これまで、工場出荷時のリセット後に変更される可能性があるため、Android_IDの使用を削除しました。また、[〜#〜] imei [〜#〜]の使用を削除しました。これは、Androidデバイスが電話ではありません。wifiまたはbluetoothMAC ADDRESSは使用できません。デバイスにそのようなハードウェアがないか、MACアドレスが読めない可能性があるためです。ハードウェアが有効になっていない場合(Webで見つけたものに基づいて)。

Androidデバイスのシリアル番号に行くかもしれません。

Android.os.Build.SERIALを使用して簡単にアクセスできます(APIレベル9で追加され、追加の許可は必要ないため)。

私の質問は:

  • 私のアプリケーションがAndroid 4.0(API 14)以上を対象としていることを考慮に入れると、Android.os.Build.SERIALAndroid各デバイスに固有のデバイスの番号?

  • 現在、Android.os.Build.SERIALのドキュメントは次を示しています:ハードウェアシリアル番号(利用可能な場合)。英数字のみ、大文字と小文字は区別されません。これは、シリアル番号が利用できない可能性があることを意味しますか?

  • 上記の条件を満たす別の選択肢は何でしょうか?

52
Leeeeeeelo

私のアプリケーションがAndroid 4.0(API 14)以上を対象としていることを考慮に入れると、Androidのデバイス固有のAndroid.os.Build.SERIAL番号が各デバイス

この便利な article によると、Android Developers blog、Android.os.Build.SERIALshould可能な場合は一意である必要があります。記事から:

テレフォニーのないデバイスは、ここで一意のデバイスIDを報告する必要があります。一部の電話でも同様です。

これは、シリアル番号が利用できない可能性があることを意味しますか?

正しい、利用できない場合があります。 「テレフォニーのないデバイスが必要です...」であることに注意してください。したがって、「テレフォニー」のないデバイス(wifiのみのタブレットなど) SERIAL番号。ただし、一部の電話ではまだ使用できます(Nexus 4など)。

このトピックに関するドキュメントは間違いなく欠けていますが、文言から、「テレフォニーのないデバイス」のみが一意のIDを送信する必要があり、一方、送信する電話は一意ではない場合があります。

上記の条件を満たす別の選択肢は何でしょうか?

あなたの状況では、deviceId(IMEI、またはそうでないもの)を最初にチェックし、deviceIdが存在しない場合はAndroid.os.Build.SERIAL(これはおそらくタブレットであるため)のように:

public static String getDeviceId(Context context) {
    final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
    if (deviceId != null) {
        return deviceId;
    } else {
        return Android.os.Build.SERIAL;
    }
}

deviceIdを使用するには、許可が必要であることを覚えておいてくださいAndroid.permission.READ_PHONE_STATE

SoアプリのminSDKは14であるため、フィールドAndroid.os.Build.SERIAL。そして、テレフォニーのないデバイスが本当にSERIALで常に一意のIDを提供すると仮定した場合、これは常に一意のデバイスIDを取得するのに安全な賭けになると思います(もちろんバグを抑制).

54
Tony Chan

私は個人的にSecure.Android_IDBuild.SERIALを使用して電話を識別しています:

androidId = Settings.Secure.getString(this.getContentResolver(), 
                Settings.Secure.Android_ID) + Build.SERIAL;

同じAndroid_IDを持っているかもしれませんが、SERIALを持っていないかもしれません。しかし、両方の可能性は低いです。

9
Kai Wang

あなたは状況をかなりうまくまとめているようです。

シリアル番号は各デバイスで一意になるように意図されていますが、(これはAndroidであるため)もちろん、例外を作成するバグがあります。 https://code.google.com/p/Android/issues/detail?id=3519

あなたが指摘しているように、ドキュメントはこれがハードウェアのシリアル番号であることを意図していることを示唆していますが、その表現はあなたがそれに頼るべきではないことを示唆しています。デバイスの実際のシリアル番号、つまり、背面または箱に印刷されているシリアル番号と間違えないでください。同様に、Android_idよりもはるかに広く使用されていないため、報告されていない問題がある可能性があります。

Android_idはシリアル番号に基づいていることが広く報告されていますが、それは真実ではないと思います-最近、新しいマルチユーザー機能を備えたタブレットでは、各ユーザーアカウントが独自のAndroid_idを取得しますが、シリアル番号は両方で同じです。

私の知る限り、「別の選択肢」は存在しません。リストは完全です。シリアル番号は、wifiまたはbluetoothの許可に依存する準備ができていない限り、最も近いものです。

4
Tom

私は通常、一意の文字列(通常は会社名)+ imei(imeiがない場合、macアドレス[wifi、bluetoothなど)のSHA1ハッシュを実行することにより、一意のIDを取得します。これにより、同じように見える一意のIDがデバイスごとに一意になる傾向があります(ただし、MACが変更/偽造された場合は完全ではありません)。

0
Ryan Schultz