【问题标题】:Get Android Phone Model programmatically , How to get Device name and model programmatically in android?以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?
【发布时间】:2011-01-01 00:19:07
【问题描述】:

我想知道是否有办法在 Android 中以编程方式读取手机模型。

我想要一个字符串,如 HTC Dream、Milestone、Sapphire 或其他...

【问题讨论】:

  • 我不明白为什么 Google 不包含 Build.MARKET_NAME 之类的内容

标签: android model device android-hardware


【解决方案1】:

我使用以下代码获取完整的设备名称。它获取模型和制造商字符串并将它们连接起来,除非模型字符串已经包含制造商名称(在某些手机上):

public String getDeviceName() {
    String manufacturer = Build.MANUFACTURER;
    String model = Build.MODEL;
    if (model.toLowerCase().startsWith(manufacturer.toLowerCase())) {
        return capitalize(model);
    } else {
        return capitalize(manufacturer) + " " + model;
    }
}


private String capitalize(String s) {
    if (s == null || s.length() == 0) {
        return "";
    }
    char first = s.charAt(0);
    if (Character.isUpperCase(first)) {
        return s;
    } else {
        return Character.toUpperCase(first) + s.substring(1);
    }
} 

 

以下是我从用户那里获得的一些设备名称示例:

三星 GT-S5830L
摩托罗拉 MB860
索尼爱立信 LT18i
LGE LG-P500
HTC Desire V
HTC Wildfire S A510e

【讨论】:

  • 它有一个列表,其中包含您可以从电话中获得的所有可能答案。假设您需要引导用户了解如何在特定手机类型上安装某些东西或将某些东西卖给特定型号。
  • @evilfish 试试这个来自 Google 的列表:support.google.com/googleplay/answer/1727131
  • 在手表上完美运行,因为我需要它用于 Android Wear。
  • 我不明白为什么 Google 不包含 Build.MARKET_NAME 之类的内容
【解决方案2】:

在许多流行的设备上,该设备的市场名称不可用。例如,在三星 Galaxy S6 上,Build.MODEL 的值可能是"SM-G920F""SM-G920I""SM-G920W8"

我创建了一个小型库,用于获取设备的市场(消费者友好)名称。它为 10,000 台设备获取正确名称,并且不断更新。如果您想使用我的图书馆,请点击以下链接:

AndroidDeviceNames Library on Github


如果您不想使用上面的库,那么这是获得消费者友好设备名称的最佳解决方案:

/** Returns the consumer friendly device name */
public static String getDeviceName() {
  String manufacturer = Build.MANUFACTURER;
  String model = Build.MODEL;
  if (model.startsWith(manufacturer)) {
    return capitalize(model);
  }
  return capitalize(manufacturer) + " " + model;
}

private static String capitalize(String str) {
  if (TextUtils.isEmpty(str)) {
    return str;
  }
  char[] arr = str.toCharArray();
  boolean capitalizeNext = true;

  StringBuilder phrase = new StringBuilder();
  for (char c : arr) {
    if (capitalizeNext && Character.isLetter(c)) {
      phrase.append(Character.toUpperCase(c));
      capitalizeNext = false;
      continue;
    } else if (Character.isWhitespace(c)) {
      capitalizeNext = true;
    }
    phrase.append(c);
  }

  return phrase.toString();
}

来自我的 Verizon HTC One M8 的示例:

// using method from above
System.out.println(getDeviceName());
// Using https://github.com/jaredrummler/AndroidDeviceNames
System.out.println(DeviceName.getDeviceName());

结果:

HTC6525LVW

HTC One (M8)

【讨论】:

  • 谢谢贾里德。我今天需要这个,但对于 Xamarin.Android,所以将您的文件翻译成 C#。如果其他人需要它,你可以在这里找到它。 gist.github.com/mohibsheth/5e1b361ae49c257b8caf
  • 有没有办法在没有这个设备类的情况下获得像“Xperia Z3”或“Galaxy S3”这样的“人类可读”设备名称?我不喜欢使用所有设备的静态列表来确保甚至支持所有未来的设备。
  • @Radon8472 你试过上面名为getDeviceName()的静态工厂方法吗?如果这不能为您提供您正在寻找的结果,那么据我所知,没有更好的解决方案。
  • @Jared:我已经有了一个类似于“getDeviceName()”结果的设备名称,但我喜欢显示最终用户从他们的便利商店中知道的名称:(
  • 大家好,我使用 Jared 的列表为此编写了一个名为 ng-fone 的 Angular 模块。以下链接提供了有关如何使用它的说明。 tphangout.com/?p=83
【解决方案3】:

是的:Build.MODEL

【讨论】:

  • 当我用模拟器尝试它时,它总是给我“为 x86 构建的 Android SDK”。无法在使用不同型号名称的模拟器中专门获取型号名称。
  • 是的,这就是模拟器的型号。请注意,它甚至为内部存储使用类似的名称。
【解决方案4】:

对于那些正在寻找Build 的完整属性列表的人来说,这里是 Sony Z1 Compact 的一个示例:

Build.BOARD = MSM8974
Build.BOOTLOADER = s1
Build.BRAND = Sony
Build.CPU_ABI = armeabi-v7a
Build.CPU_ABI2 = armeabi
Build.DEVICE = D5503
Build.DISPLAY = 14.6.A.1.236
Build.FINGERPRINT = Sony/D5503/D5503:5.1.1/14.6.A.1.236/2031203XXX:user/release-keys
Build.HARDWARE = qcom
Build.HOST = BuildHost
Build.ID = 14.6.A.1.236
Build.IS_DEBUGGABLE = false
Build.MANUFACTURER = Sony
Build.MODEL = D5503
Build.PRODUCT = D5503
Build.RADIO = unknown
Build.SERIAL = CB5A1YGVMT
Build.SUPPORTED_32_BIT_ABIS = [Ljava.lang.String;@3dd90541
Build.SUPPORTED_64_BIT_ABIS = [Ljava.lang.String;@1da4fc3
Build.SUPPORTED_ABIS = [Ljava.lang.String;@525f635
Build.TAGS = release-keys
Build.TIME = 144792559XXXX
Build.TYPE = user
Build.UNKNOWN = unknown
Build.USER = BuildUser

您可以使用 kotlin 使用“评估表达式”对话框在调试模式下轻松列出设备的这些属性:

android.os.Build::class.java.fields.map { "Build.${it.name} = ${it.get(it.name)}"}.joinToString("\n")

【讨论】:

    【解决方案5】:

    实际上这不是 100% 正确的。这可以给你模型(有时是数字)。
    将为您提供手机的制造商(您请求的 HTC 部分):

     Build.MANUFACTURER
    

    对于产品名称:

     Build.PRODUCT
    

    【讨论】:

    • 我发现String name = Build.MANUFACTURER + " - " + Build.MODEL 是最有用的组合。 Build.PRODUCT 有时会使用意想不到的名称。例如,在 Galaxy Nexus 上,它返回“takgu”。另一方面,Build.MODEL 是设置->关于手机->型号下显示的面向用户的值。
    • 很大程度上取决于制造商; HTC 设备(Evo 4G、4G LTE、3D 和 Slide)使用我上面所说的。
    • AXON 7 mini 在列表中。然而,常规尺寸的 AXON 在哪里?
    【解决方案6】:
    String deviceName = android.os.Build.MODEL; // returns model name 
    
    String deviceManufacturer = android.os.Build.MANUFACTURER; // returns manufacturer
    

    使用以下方法以编程方式获取型号和制造商

      public String getDeviceName() {
            String manufacturer = Build.MANUFACTURER;
            String model = Build.MODEL;
            if (model.toLowerCase().startsWith(manufacturer.toLowerCase())) {
                return capitalize(model);
            } else {
                return capitalize(manufacturer) + " " + model;
            }
        }
    
    
        private String capitalize(String s) {
        if (s == null || s.length() == 0) {
            return "";
        }
        char first = s.charAt(0);
        if (Character.isUpperCase(first)) {
            return s;
        } else {
            return Character.toUpperCase(first) + s.substring(1);
        }
    

    【讨论】:

      【解决方案7】:

      显然您需要使用来自 Google 的列表https://support.google.com/googleplay/answer/1727131

      API 不会返回任何我期望的内容或设置中的任何内容。对于我的摩托罗拉 X,这就是我得到的

         Build.MODEL = "XT1053"
         Build.BRAND = "motorola"
         Build.PRODUCT = "ghost"
      

      page 上面提到的“ghost”映射到 Moto X。看起来这可能更简单一点...

      【讨论】:

      • AXON 7 mini 在列表中。然而,常规尺寸的 AXON 在哪里?
      【解决方案8】:

      当您要检索制造商、设备名称和/或型号时,都可以使用以下字符串:

      String manufacturer = Build.MANUFACTURER;
      String brand        = Build.BRAND;
      String product      = Build.PRODUCT;
      String model        = Build.MODEL;
      

      【讨论】:

        【解决方案9】:

        您可以使用以下代码获取品牌名称和 设备的品牌型号。

         String brand = Build.BRAND; // for getting BrandName
         String model = Build.MODEL; // for getting Model of the device
        

        【讨论】:

          【解决方案10】:

          Kotlin 短版:

          import android.os.Build.MANUFACTURER
          import android.os.Build.MODEL
          
          fun getDeviceName(): String =
              if (MODEL.startsWith(MANUFACTURER, ignoreCase = true)) {
                  MODEL
              } else {
                  "$MANUFACTURER $MODEL"
              }.capitalize(Locale.ROOT)
          

          【讨论】:

          • capitalize 现在已弃用。而是使用这个.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
          【解决方案11】:
          Build.DEVICE // The name of the industrial design.
          

          Build.DEVICE 为某些设备提供人类可读的名称,而不是Build.MODEL

          Build.DEVICE = OnePlus6
          Build.MANUFACTURER = OnePlus
          Build.MODEL = ONEPLUS A6003
          

          【讨论】:

            【解决方案12】:

            这是我的代码,获取制造商、品牌名称、操作系统版本和支持 API 级别

            String manufacturer = Build.MANUFACTURER;
            
            String model = Build.MODEL + " " + android.os.Build.BRAND +" ("
                       + android.os.Build.VERSION.RELEASE+")"
                       + " API-" + android.os.Build.VERSION.SDK_INT;
            
            if (model.startsWith(manufacturer)) {
                return capitalize(model);
            } else {
                return capitalize(manufacturer) + " " + model;
            }
            

            输出:

            System.out: button press on device name = Lava Alfa L iris(5.0) API-21
            

            【讨论】:

              【解决方案13】:

              Kotlin 版本

              val Name: String by lazy {
                  val manufacturer = Build.MANUFACTURER
                  val model = Build.MODEL
                  if (model.toLowerCase().startsWith(manufacturer.toLowerCase())) {
                      capitalize(model)
                  } else {
                      capitalize(manufacturer) + " " + model
                  }
              }
              
              private fun capitalize(s: String?): String {
                  if (s == null || s.isEmpty()) {
                      return ""
                  }
                  val first = s[0]
                  return if (Character.isUpperCase(first)) {
                      s
                  } else {
                      Character.toUpperCase(first) + s.substring(1)
                  }
              }
              

              【讨论】:

              【解决方案14】:

              稍微更改了 Idolons 代码。这将在获取设备型号时将单词大写。

              public static String getDeviceName() {
                  final String manufacturer = Build.MANUFACTURER, model = Build.MODEL;
                  return model.startsWith(manufacturer) ? capitalizePhrase(model) : capitalizePhrase(manufacturer) + " " + model;
              }
              
              private static String capitalizePhrase(String s) {
                  if (s == null || s.length() == 0)
                      return s;
                  else {
                      StringBuilder phrase = new StringBuilder();
                      boolean next = true;
                      for (char c : s.toCharArray()) {
                          if (next && Character.isLetter(c) || Character.isWhitespace(c))
                              next = Character.isWhitespace(c = Character.toUpperCase(c));
                          phrase.append(c);
                      }
                      return phrase.toString();
                  }
              }
              

              【讨论】:

                【解决方案15】:

                您可以从

                蓝牙适配器

                如果手机不支持蓝牙,那么你必须从

                构造设备名称

                android.os.Build 类

                这是获取电话设备名称的示例代码。

                public String getPhoneDeviceName() {  
                        String name=null;
                        // Try to take Bluetooth name
                        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
                        if (adapter != null) {
                            name = adapter.getName();
                        }
                
                        // If not found, use MODEL name
                        if (TextUtils.isEmpty(name)) {
                            String manufacturer = Build.MANUFACTURER;
                            String model = Build.MODEL;
                            if (model.startsWith(manufacturer)) {
                                name = model;
                            } else {
                                name = manufacturer + " " + model;
                            }
                        } 
                        return name;
                }
                

                【讨论】:

                • 谢谢!!请注意,此功能需要 BLUETOOTH 权限。
                【解决方案16】:

                您可以尝试以下函数并以字符串格式返回您的手机型号名称。

                public String phoneModel() {
                
                    return Build.MODEL;
                }
                

                【讨论】:

                • 这个答案并没有比其他任何说同样事情的答案有所改进,并且在一年前被留在这里。
                猜你喜欢
                • 2014-01-17
                • 1970-01-01
                • 2018-10-07
                • 1970-01-01
                • 2021-02-07
                • 1970-01-01
                • 1970-01-01
                • 2010-09-11
                • 1970-01-01
                相关资源
                最近更新 更多