web-dev-qa-db-ja.com

Android:AVDマネージャーに表示されるデバイスのシリアル番号にプログラムでアクセスする方法(APIバージョン8)

以下の画像に示されている値にプログラムでアクセスするにはどうすればよいですか?

enter image description here

41
Heshan Perera

これはハードウェアのシリアル番号です。アクセスするには

  • Android 8以降(> = SDK 26)Android.os.Build.getSerial()を使用します。これには危険な許可が必要です READ_PHONE_STATEAndroid.os.Build.SERIALを使用すると、 Android.os.Build.UNKNOWN が返されます。

  • Android 7.1以前(<= SDK 25)以前 Android.os.Build.SERIAL は有効なシリアルを返します。

あらゆるデバイスに固有です。一意のデバイスIDを取得/使用する方法の可能性を探している場合は、 here と読む必要があります。

許可を必要としないリフレクションを含むソリューションについては、 this answer を参照してください。

71
thaussma

最大Android 7.1(SDK 25)

Android 7.1までは、次の方法で取得できます。

_Build.SERIAL
_

From Android 8(SDK 26)

Android 8(SDK 26)以上では、このフィールドは UNKNOWN を返し、次の方法でアクセスする必要があります。

_Build.getSerial()
_

危険な許可_Android.permission.READ_PHONE_STATE_ が必要です。

From Android Q(SDK 29)

Android Q Build.getSerial()を使用するとQが必要になるため、少し複雑になります:

_Android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE_(システムアプリでのみ取得可能)、または呼び出しパッケージがデバイスになるまたはプロファイル所有者_READ_PHONE_STATE_ 権限があります。これは、ほとんどのアプリがこの機能を使用できないことを意味します。 Googleの Android Qの発表 をご覧ください。

Android SDKリファレンス を参照してください


一意のデバイス識別子のベストプラクティス

一意の識別子のみが必要な場合、ハードウェア識別子を使用しないようにすることをお勧めします。Googleは、プライバシー上の理由からハードウェア識別子へのアクセスを継続的に困難にしているためです。 UUID.randomUUID().toString();を生成し、最初にアクセスする必要があるときに保存することができます。共有設定。または、 _Android_ID_ を使用することもできます。これは、デバイス、ユーザー、および(Android 8+)アプリのインストールのみに固有の8バイトの16進文字列です。そのトピックの詳細については、 一意の識別子のベストプラクティス を参照してください。

40
patrickf

Build.SERIAL空にすることができます または場合によっては、デバイスの設定で確認できる値とは異なる値( proof 1proof 2 )を返します。

より完全で堅牢なソリューションが必要な場合は、単一の Gist で見つかる可能性のあるすべてのソリューションをコンパイルしました。以下はその簡略版です。

public static String getSerialNumber() {
    String serialNumber;

    try {
        Class<?> c = Class.forName("Android.os.SystemProperties");
        Method get = c.getMethod("get", String.class);

        serialNumber = (String) get.invoke(c, "gsm.sn1");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "ril.serialnumber");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "ro.serialno");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "sys.serialnumber");
        if (serialNumber.equals(""))
            serialNumber = Build.SERIAL;

        // If none of the methods above worked
        if (serialNumber.equals(""))
            serialNumber = null;
    } catch (Exception e) {
        e.printStackTrace();
        serialNumber = null;
    }

    return serialNumber;
}

新しいデバイスまたはAndroidバージョン。投稿も歓迎します。

13
flawyte