以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?

Posted

技术标签:

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

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

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

【问题讨论】:

我不明白为什么 Google 不包含 Build.MARKET_NAME 之类的内容 【参考方案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)
    

【讨论】:

我用 Kotlin 的 capitalize ***.com/a/59158474/1446466 发布了一个较短的版本【参考方案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;

【讨论】:

这个答案并没有比其他任何说同样事情的答案有所改进,并且在一年前被留在这里。

以上是关于以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式获取android手机的IP地址......? [复制]

如何以编程方式获取“版本代码”和“型号代码”

如何以编程方式在android中获取连接的wifi路由器的IP地址?

如何以编程方式避免android手机中的深度睡眠模式?

如何以编程方式从 iOS 设备获取自己的手机号码? [复制]

如何在同一网络上以编程方式获取其他支持Wifi的设备的IP地址?