获取Android设备名称

208

如何获取Android设备名称?我正在使用HTC Desire。当我通过HTC Sync连接时,该软件显示名称为'HTC Smith'。我想通过代码获取这个名称。

在Android中如何实现呢?


“设备名称”是什么意思?很多安卓手机没有设备名称。例如,一些三星手机有可编辑的设备名称。但所有的安卓手机都有一个“型号号码”,它是一个字符串(有点令人困惑)。 - AlikElzin-kilaka
相关链接:https://dev59.com/d2Qn5IYBdhLWcg3wmILY - AlikElzin-kilaka
请参考更新的相关帖子:https://dev59.com/NqLia4cB1Zd3GeqPjHKe - Richard Le Mesurier
这个问题与 Get Android Phone Model Programmatically 不同:这里的 OP 想要查看设备的 给定名称,而这个名称可以被最终用户更改,而 Build.MODEL 则是由制造商硬编码的。 - Alex Cohn
16个回答

319

为了获取Android设备名称,您只需要添加一行代码:

android.os.Build.MODEL;

在这里找到:获取Android设备名称


109
为了澄清一下,BUILD.MODEL只提供设备的型号而不是设备的名称。例如,它会返回GT-I9100而不是三星Galaxy S2。如果您想要设备的名称,您需要自己提供一个列表并将其与android.os.Build.MANUFACTURERandroid.os.Build.PRODUCT的组合进行匹配。 - ChuongPham
2
实际上,我发现Build.MODEL是型号名称,例如我的设备显示为“Nexus 7”和“Motorola Electrify”。 - Tony Maro
8
@Chuong - 我可以在哪里获取这样的清单? - Andrew Bullock
1
@TonyMaro:并非所有移动设备/平板电脑都像您的Nexux/Motorola设备一样显示相似的信息。因此,使用android.os.Build.MODEL并假设所有制造商的移动设备/平板电脑将显示相同的信息是不可靠的。如果您想匹配设备型号和设备名称,则需要创建自己的列表。 - ChuongPham
1
@AndrewBullock:你需要创建自己的列表。可以查看像三星更新SamMobile这样的网站获取设备名称。然后,创建一个包含设备型号和名称的Android资源文件,并在代码中引用它。 - ChuongPham
显示剩余2条评论

55

您可以在这里查看答案 以编程方式获取Android手机型号

public String getDeviceName() {
   String manufacturer = Build.MANUFACTURER;
   String model = Build.MODEL;
   if (model.startsWith(manufacturer)) {
      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);
    }
}

1
Build.MANUFACTURER 在 Clover 设备上返回 "unknown"。因此,我不知道 Build.MANUFACTURER 的可靠性如何。 - Rohit Singh

54

我通过获取蓝牙名称来解决了这个问题,但不是通过BluetoothAdapter(需要蓝牙权限)。

以下是代码:

Settings.Secure.getString(getContentResolver(), "bluetooth_name");

无需额外权限。

更新:在targetSdk 32或更高版本上不起作用。


3
作为一个加分项(或惩罚,根据您的需求而定),如果用户输入了自定义名称,这将报告用户输入的设备名称。 - jk7
8
在设置中,“Settings.Secure”中的“bluetooth_name”只有在设备重启后才会显示用户定义的名称,而“Settings.Global”(API 17+)中的“device_name”将立即在三星S6 active上显示用户定义的名称。名称可以被找到的位置因制造商或型号而异。 - jk7
1
这个可行,最近在2019年进行了测试。感谢您提供干净的回应。 - truedat101
好的,抱歉。可能这取决于设备,而Global正在使用三星手机进行工作。 - Micer
2
只是补充一下,这可能有点老了。但是你可以使用Settings.Global。你需要定义Android提供程序:例如: android.provider.Settings.Global.getString(getContentResolver(), "device_name"); - Dave Hamilton
显示剩余2条评论

28

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

我创建了一个小型库,可以获取设备的市场(用户友好)名称。它可以正确获取超过10,000个设备的名称,并且会不断更新。如果您希望使用我的库,请单击下面的链接:

Github上的AndroidDeviceNames库


如果您不想使用上述库,则这是获取用户友好设备名称的最佳解决方案:

/** 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;
    String phrase = "";
    for (char c : arr) {
        if (capitalizeNext && Character.isLetter(c)) {
            phrase += Character.toUpperCase(c);
            capitalizeNext = false;
            continue;
        } else if (Character.isWhitespace(c)) {
            capitalizeNext = true;
        }
        phrase += c;
    }
    return phrase;
}

来自我使用的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)


@Jared,这个库不会违反谷歌政策吧?因为最近有些应用因为使用第三方库而违反了谷歌政策而被拒绝在Play商店上架。 - ShriKant A

25

试一下吧。你可以通过蓝牙获取设备名称。

希望这能帮到你。

public String getPhoneName() {  
        BluetoothAdapter myDevice = BluetoothAdapter.getDefaultAdapter();
        String deviceName = myDevice.getName();     
        return deviceName;
    }

它对我不起作用。无论是在模拟器上还是在我的安卓手机上都不行。我尝试在打开手机蓝牙之后再试一次。 - Amna Ali
1
你得到了什么结果?请记住,这种方法还需要在清单中添加额外的蓝牙权限。 - Andrew T.
2
在三星S3和Nexus 5上运行正常(在已经具有蓝牙权限的应用程序中)。您还应该检查myDevice == null,这样您就不会在没有蓝牙的设备上遇到问题。在这种情况下,我使用:deviceName = Build.MANUFACTURER +“ ”+ Build.MODEL; - Wookie
这只是为了一个名称而需要额外的权限! - Themelis
这在模拟器上不起作用(至少不是使用Android SDK分发的那些),因为它们没有提供模拟的蓝牙适配器。 - Nathan Osman
由于我在Xamarin上有相同的问题,因此我不会提供代码,但值得一提的是,自Android 12以来,您还需要请求运行时权限(之前仅存在安装时权限)才能使用BLUETOOTH_CONNECT - iBobb

14

您可以使用:

来自 Android 文档:

MANUFACTURER

String MANUFACTURER
该产品/硬件的制造商。 MODEL: 型号
String MODEL

最终产品的用户可见名称。

DEVICE:

String DEVICE

工业设计的名称。

例如:

String deviceName = android.os.Build.MANUFACTURER + " " + android.os.Build.MODEL;
//to add to textview
TextView textView = (TextView) findViewById(R.id.text_view);
textView.setText(deviceName);

此外,Build类中有许多可用的属性,例如:

  • os.android.Build.BOARD
  • os.android.Build.BRAND
  • os.android.Build.BOOTLOADER
  • os.android.Build.DISPLAY
  • os.android.Build.CPU_ABI
  • os.android.Build.PRODUCT
  • os.android.Build.HARDWARE
  • os.android.Build.ID

此外,还有其他方法可以获得设备名称,而无需使用 Build 类(通过蓝牙)。


13

以下方法适用于我。

String deviceName = Settings.Global.getString(.getContentResolver(), Settings.Global.DEVICE_NAME);

我不认为这是重复的答案。上面的人们在谈论设置安全性,对我来说,设置安全性就是给予空值,如果我使用设置全局,则可以工作。无论如何,谢谢。


这是正确的答案,因为用户可能更改设备的名称。 - Rares Serban

7

一种通用的方法,可使用户定义的设备名称适用于几乎所有设备,且无需任何权限。

String userDeviceName = Settings.Global.getString(getContentResolver(), Settings.Global.DEVICE_NAME);
if(userDeviceName == null)
    userDeviceName = Settings.Secure.getString(getContentResolver(), "bluetooth_name");

4
请注意,在API 31(S)之后,使用Settings.Secure.getString获取“bluetooth_name”将导致异常。我自己尝试过,在此处公开代码中可用。 - iBobb
@iBobb,在API 32及以上版本中,是否有其他方法可以获取用户指定的设备名称? - Martin Růžek
我仍然针对API 31,并使用此解决方案,如果它返回空,则显示DeviceInfo.Name(来自Xamarin.Essentials)。由于Google尚未强制我们这样做,因此还没有重构以支持API 32。根据您的重要性,您可以只使用DeviceInfo.Name或让用户知道为了正确显示此信息,您需要从他们那里请求蓝牙权限并从Xamarin公开的某些蓝牙API中获取信息。 - iBobb

5

试试这段代码,你可以获取到安卓设备的名称。

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

2

更新 您可以轻松地从buildprop中检索设备。

static String GetDeviceName() {
    Process p;
    String propvalue = "";
    try {
        p = new ProcessBuilder("/system/bin/getprop", "ro.semc.product.name").redirectErrorStream(true).start();
        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while ((line = br.readLine()) != null) {
            propvalue = line;
        }
        p.destroy();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return propvalue;
}

但请记住,这在某些设备上不起作用。

1
这个答案与 https://dev59.com/9Ww05IYBdhLWcg3wuUAL#23729614 和 https://dev59.com/9Ww05IYBdhLWcg3wuUAL#41184389 有何不同? - Micer
更新了答案 - Yasiru Nayanajith
没有蓝牙权限,这个能工作吗? - Luc Bloom
您无需蓝牙权限即可通过BuildProp获取设备名称。 - Yasiru Nayanajith

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