如何使用Nativescript获取设备的序列号?

时间:2018-12-21 17:30:44

标签: nativescript

有人知道如何获取设备的序列号吗?

我知道我可以在NativeScript-5应用程序(TypeScript)中做到这一点:

import { Page } from "tns-core-modules/ui/page";    
import * as platformModule from "tns-core-modules/platform";

export function onNavigatingTo(args: EventData) {
    let page = <Page>args.object;

    console.log("Manufacturer:" + platformModule.device.manufacturer);
    console.log("Model:" + platformModule.device.model);
    console.log("UUID:" + platformModule.device.uuid);
}

但是我找不到设备序列号的任何属性。 有人有主意吗?没关系,如果您的解决方案仅适用于Android(因为我的项目仅针对Android平板电脑)。

谢谢!

更新

Manoj向我指出了一些可能解决了我问题的Java代码。但是,我无法将以下代码编组到TypeScript。

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

也许有人可以帮助我吗?太棒了!

2 个答案:

答案 0 :(得分:3)

iOS绝不允许应用访问任何机密信息,这些信息也适用于序列号。在Android上,您可以使用

读取序列号
android.os.Build.SERIAL

我已经用Playground进行了测试

编辑1:

像三星这样的制造商似乎具有与android.os.Build.SERIAL不同的序列号。 Here is another SO thread似乎与三星非常相关,示例代码是用Java编写的。

编辑2:

这是在三星设备上获取序列号的方法

        let serialNumber = ''; 
        try {
            const cl = application.android.context.getClassLoader();
            const SystemProperties = cl.loadClass('android.os.SystemProperties');

            const paramTypes = (<any>Array).create(java.lang.Class, 2);
            paramTypes[0] = java.lang.String.class;
            paramTypes[1] = java.lang.String.class;
            const getMethod = SystemProperties.getMethod('get', paramTypes);

            const params = (<any>Array).create(java.lang.Object, 2);
            params[0] = new java.lang.String('ril.serialnumber');
            params[1] = new java.lang.String('unknown');

            serialNumber = getMethod.invoke(SystemProperties, params);
        } catch (err) {
            console.error(err);
        }

Updated Playground

答案 1 :(得分:0)

您可以检查属性'ro.serialno','ril.serialnumber','gsm.sn1','sys.serialnumber'

Android: How to programmatically access the device serial number shown in the AVD manager (API Version 8)

在我的情况下,Samsung TAB S2具有2个序列号。属性“ ro.serialno”比“ ril.serialnumber”更准确。所以我先检查一下。

getSerial() {
  if (isAndroid) {
    let serialNumber = null;
    try {
      const cl = application.android.context.getClassLoader();
      const SystemProperties = cl.loadClass('android.os.SystemProperties');

      const paramTypes = (<any>Array).create(java.lang.Class, 2);
      paramTypes[0] = java.lang.String.class;
      paramTypes[1] = java.lang.String.class;
      const getMethod = SystemProperties.getMethod('get', paramTypes);

      const params = (<any>Array).create(java.lang.Object, 2);

      // Reorder if needed
      const props = ['ro.serialno', 'ril.serialnumber', 'gsm.sn1', 'sys.serialnumber'];

      for(let i = 0, len = props.length; i < len; i++) {

        params[0] = new java.lang.String(props[i]);
        serialNumber = getMethod.invoke(SystemProperties, params);

        if (serialNumber !== '') {
          return serialNumber;
        }
      }

    } catch (err) {
      console.error(err);
    }

    return serialNumber;
  }
}

完整代码:https://play.nativescript.org/?template=play-tsc&id=ViNo6g&v=6