如何解码android.os.Build.SERIAL?

4
我正在处理循环序列号的主题,以提供一个唯一的ID。
我尝试这个:
       String serial = null; 

        try {
            Class<?> c = Class.forName("android.os.SystemProperties");
            Method get = c.getMethod("get", String.class);
            serial = (String) get.invoke(c, "ro.serialno");
        } catch (Exception ignored) {
        }

and

        StringBuilder sb = new StringBuilder();
        sb.append("SERIAL ").append(android.os.Build.SERIAL).append("\n");


        textReportAdmin.setText(
                sb.toString());

两者都给出相同的值:C4F12FDD949F22F 在我的平板电脑的盒子和贴纸上,序列号是:RF2C202WYME 我正在使用平板电脑工作,无法使用。
    TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
    String imei = telephonyManager.getDeviceId();

我的情况下IMEI为空。
我需要的是SERIAL,但我需要它以标签后面条形码上显示的清晰版本为准。
我猜这是可能的,因为当进入系统应用程序并查看设备状态时,它会以清晰的方式显示...
如何将android.os.Build.SERIAL返回的值转换为人类可见的值?
注:我还查看了:
        sb.append("PRODUCT ").append(android.os.Build.PRODUCT).append("\n");
        sb.append("BOARD ").append(android.os.Build.BOARD).append("\n");
        sb.append("BOOTLOADER ").append(android.os.Build.BOOTLOADER).append("\n");
        sb.append("BRAND ").append(android.os.Build.BRAND).append("\n");
        sb.append("CPU_ABI ").append(android.os.Build.CPU_ABI).append("\n");
        sb.append("CPU_ABI2 ").append(android.os.Build.CPU_ABI2).append("\n");
        sb.append("DEVICE ").append(android.os.Build.DEVICE).append("\n");
        sb.append("DISPLAY ").append(android.os.Build.DISPLAY).append("\n");
        sb.append("FINGERPRINT ").append(android.os.Build.FINGERPRINT).append("\n");
        sb.append("HARDWARE ").append(android.os.Build.HARDWARE).append("\n");
        sb.append("HOST ").append(android.os.Build.HOST).append("\n");
        sb.append("ID ").append(android.os.Build.ID).append("\n");
        sb.append("MANUFACTURER ").append(android.os.Build.MANUFACTURER).append("\n");
        sb.append("MODEL ").append(android.os.Build.MODEL).append("\n");
        sb.append("PRODUCT ").append(android.os.Build.PRODUCT).append("\n");
        sb.append("RADIO ").append(android.os.Build.RADIO).append("\n");
        sb.append("SERIAL ").append(android.os.Build.SERIAL).append("\n");
        sb.append("TAGS ").append(android.os.Build.TAGS).append("\n");
        sb.append("TIME ").append(android.os.Build.TIME).append("\n");
        sb.append("TYPE ").append(android.os.Build.TYPE).append("\n");
        sb.append("USER ").append(android.os.Build.USER).append("\n");

无处可找到序列号,我只能在贴纸上找到它,但实际上系统本身也可以在“参数”、“关于”、“状态”中显示它(我不知道英语中的词语,我有一个法语标签,它是“Paramètres”、“A propos de”、“Etat”,然后是“Serial Number”,就像在贴纸上一样的清晰版本)。

使用串口作为标识符真的好吗?“如果可用,可以使用硬件串行号”。 - keiki
1
你有什么证据证明你通过不受支持的方式获取的“循环序列号”将成为可靠的“唯一标识符”?你将如何强制所有设备制造商确保该值存在并在制造商之间是唯一的?你将如何处理已经存在的数亿台设备?你将如何解决可以随意更改这些值的ROM修改?你将如何强制Google不取消您通过反射读取此值的能力? - CommonsWare
我需要获取盒子上和标签后面显示的序列号。在“参数”、“关于”、“状态”中,序列号清晰地显示在盒子和标签上,这是可能的。这不是为了欺诈追踪,而是为了维护目的。我需要任何没有高度学位的人都能看到的东西,“请翻转您的标签并读出上面的数字”。 - christophe46
你为什么认为某个贴纸上的数值一定会在设备中反映出来呢?例如,在我的Galaxy Nexus和Nexus S上,“状态”中报告的值与电池下方的贴纸上的值不同。将要打印在某些贴纸上的值,或者即使有这样的贴纸,也将取决于设备制造商,可能与设置应用程序中的任何内容无关。 - CommonsWare
谷歌/安卓本身认为将序列号信息显示在状态框中是安全的。 - christophe46
显示剩余7条评论
4个回答

7

您尝试过这个吗?

String serial = null; 

try {
     Class<?> c = Class.forName("android.os.SystemProperties");
     Method get = c.getMethod("get", String.class);
     serial = (String) get.invoke(c, "ril.serialnumber");
 } catch (Exception ignored) {
 }

例如在联想设备上,[ril.serialnumber]不存在。 - Paul Verest
你尝试过使用android.os.Build.SERIAL吗?我相信ril.serialnumber只适用于三星设备。SystemProperties中的serial通常是供应商锁定的。 - Jonathan Liono
在联想设备上使用ro.lenovosn2。 - Henrik Solgaard
这对我的三星Galaxy平板电脑有效。我在设置中看到的序列号是ril.serialnumber,而Build.SERIALBuild.getSerial()返回不同的数字。 - OoDeLally

6
如果您想获取设备背面显示的序列号,并且您正在使用三星Galaxy Tab,为什么不使用'ril.serialnumber'属性呢?
以下是您的设备应显示的更改项:
$ adb shell getprop | grep serial
[ril.serialnumber]: [RF2C202WYME]
[ro.boot.serialno]: [c4f12fdd949f22f]
[ro.serialno]: [c4f12fdd949f22f]

在Jelly Bean之前,'ro.boot.serialno'不存在


例如在联想设备上,[ril.serialnumber] 不存在。 - Paul Verest

1

你应该使用sys.serialnumber,一些设备有ril.serialnumber,一些设备有sys.serialnumber,所以你应该尝试使用sys。


1

在许多设备上,设置-->关于活动中显示的信息是非标准的,并且无法从任何标准的Android API中获取。例如,FCC ID有时会显示在那里,但对于应用程序来说不可用。

此外,API提供的序列号没有要求必须是产品的“真实”序列号(即包装盒上的序列号),只需要是唯一的。

因此,我认为除了查看该产品或制造商的源代码(如果有)并查看是否有获取该信息的方法之外,没有其他方法可以读取盒子上和关于活动中的序列号。


在我的情况下,我想使用但没有找到的是ril.serialnumber! - christophe46

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接