Nativescript 如何获得设备';国标的序列号?

Nativescript 如何获得设备';国标的序列号?,nativescript,Nativescript,有人知道如何获取设备的序列号吗 我知道我可以在NativeScript-5应用程序(TypeScript)中执行此操作: 从“tns核心模块/ui/Page”导入{Page}; 从“tns核心模块/平台”导入*作为平台模块; 导出函数onNavigatingTo(参数:EventData){ 让page=args.object; console.log(“制造商:“+platformModule.device.Manufacturer”); 日志(“模型:“+platformModule.dev

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

我知道我可以在NativeScript-5应用程序(TypeScript)中执行此操作:

从“tns核心模块/ui/Page”导入{Page};
从“tns核心模块/平台”导入*作为平台模块;
导出函数onNavigatingTo(参数:EventData){
让page=args.object;
console.log(“制造商:“+platformModule.device.Manufacturer”);
日志(“模型:“+platformModule.device.Model”);
日志(“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;
      }
公共静态字符串getManufacturerSerialNumber(){
字符串serial=null;
试一试{
Class c=Class.forName(“android.os.SystemProperties”);
方法get=c.getMethod(“get”,String.class,String.class);
serial=(String)get.invoke(c,“ril.serialnumber”,“unknown”);
}捕获(忽略异常){}
返回序列号;
}

也许有人能帮我?那太棒了

iOS从不允许应用程序访问任何机密信息,这同样适用于序列号。使用Android,您可以使用

android.os.Build.SERIAL
我做了测试

编辑1:

像三星这样的制造商似乎有一个不同的序列号,这与其他制造商的序列号不同。这似乎与三星非常相关,示例代码是用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);
        }
让serialNumber='';
试一试{
const cl=application.android.context.getClassLoader();
const SystemProperties=cl.loadClass('android.os.SystemProperties');

const paramTypes=(

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

android.os.Build.SERIAL
我做了测试

编辑1:

像三星这样的制造商似乎有一个不同的序列号,与之不同。这似乎与三星非常相关,示例代码是用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);
        }
让serialNumber='';
试一试{
const cl=application.android.context.getClassLoader();
const SystemProperties=cl.loadClass('android.os.SystemProperties');

const paramTypes=(

您可以检查属性“ro.serialno”、“ril.serialnumber”、“gsm.sn1”、“sys.serialnumber”

在我的例子中,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;
  }
}
getSerial(){
if(isAndroid){
设serialNumber=null;
试一试{
const cl=application.android.context.getClassLoader();
const SystemProperties=cl.loadClass('android.os.SystemProperties');

const paramTypes=(

您可以检查属性“ro.serialno”、“ril.serialnumber”、“gsm.sn1”、“sys.serialnumber”

在我的例子中,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;
  }
}
getSerial(){
if(isAndroid){
设serialNumber=null;
试一试{
const cl=application.android.context.getClassLoader();
const SystemProperties=cl.loadClass('android.os.SystemProperties');

const paramTypes=(

你指的是IMEI号码吗?不是,不是IMEI。我指的是设备的真实序列号。在我的平板电脑设置中,我找到了“型号”和“序列号”.这是我要找的序列号。你指的是IMEI号吗?不,不是IMEI。我指的是设备的真实序列号。在我的平板电脑设置中,我找到了“型号”和“序列号”。这是我要找的序列号。你好,Manoj,令人惊讶的是,一台设备有这么多ID。在我的三星Galaxy平板电脑上,你的代码返回“330050c2712865fb”,这实际上是我执行“tns运行”时NativeScript的CLI显示的ID。不过,这仍然不是我要找的序列号。在我的平板电脑上,当我进入“设置>关于平板电脑”我可以看到“序列号:R52K90L6TZH“。这也是打印在盒子上的数字和设备上的标签。这也是三星Knox用于MDM的数字。奇怪的是,这么多数字……三星/MI品牌确实为他们的设备定制了Android。根据Android官方文档,这是我们应该使用的API,它在我的Moto G5+上工作,这是一个真实的API。”(未触及)谷歌的Android。如果我在三星上找到任何东西,我会继续看一看。非常感谢你,Manoj。我也会继续研究……如果你找到一个适合三星的解决方案,足以满足我的目的。我已经更新了答案,并链接到其他so线程,该线程有多个针对SamsUngul的解决方案,但它是用Java编写的。我希望你可以abl我想把它写进JS/TS。不确定。周末会看一看;)谢谢你,Manoj。你好,Manoj,一台设备有这么多ID。在我的三星Galaxy平板电脑上,你的代码返回“330050c2712865fb”,这实际上是我运行“tns”时NativeScript的CLI显示的ID。除此之外,这仍然不是我要找的序列号。在我的平板电脑上,当我进入“设置>关于平板电脑”时,我会看到一个“序列号:R52K90L6TZH”。这也是打印在盒子上的数字和设备上的贴纸。这也是三星Knox用于MDM的数字。奇怪的是,这么多数字……三星/米品牌确实如此