Uzyskaj programowo model telefonu z Androidem


355

Chciałbym wiedzieć, czy istnieje sposób programowego odczytu modelu telefonu w systemie Android.

Chciałbym dostać ciąg taki jak HTC Dream, Milestone, Sapphire lub cokolwiek ...

Odpowiedzi:


327

Na wielu popularnych urządzeniach nazwa rynkowa urządzenia jest niedostępna. Na przykład, na Samsung Galaxy S6 wartość Build.MODELmoże być "SM-G920F", "SM-G920I"albo "SM-G920W8".

Stworzyłem małą bibliotekę, która otrzymuje nazwę rynkową (przyjazną konsumentowi) urządzenia. Otrzymuje prawidłową nazwę dla ponad 10 000 urządzeń i jest stale aktualizowany. Jeśli chcesz skorzystać z mojej biblioteki, kliknij poniższy link:

Biblioteka AndroidDeviceNames na Github


Jeśli nie chcesz korzystać z powyższej biblioteki, jest to najlepsze rozwiązanie, aby uzyskać przyjazną dla konsumenta nazwę urządzenia:

/** 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();
}

Przykład z mojego Verizon HTC One M8:

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

Wynik:

HTC6525LVW

HTC One (M8)


19
Dzięki Jared. Potrzebowałem tego dzisiaj, ale dla Xamarin.Android przetłumaczyłem twój plik do C #. Jeśli ktoś tego potrzebuje, możesz go znaleźć tutaj. gist.github.com/mohibsheth/5e1b361ae49c257b8caf
Mohib Sheth

1
Czy istnieje sposób na uzyskanie nazwy „czytelnej dla człowieka”, takiej jak „Xperia Z3” lub „Galaxy S3” bez tej klasy urządzeń? Nie lubię używać statycznej listy wszystkich urządzeń, aby mieć pewność, że nawet wszystkie przyszłe urządzenia będą obsługiwane.
Radon8472,

1
@ Radon8472 Czy próbowałeś wyżej wspomnianej metody fabryki statycznej getDeviceName()? Jeśli to nie da wyników, których szukasz, nie ma lepszego rozwiązania, o którym wiem.
Jared Rummler

@Jared: Mam już nazwę devicename, taką jak wyniki 'getDeviceName ()', ale lubię wyświetlać nazwę, którą użytkownicy znają z ich przydatnych sklepów :(
Radon8472

1
Cześć wszystkim, napisałem moduł kątowy o nazwie ng-fone, korzystając z listy od Jareda. Poniższy link zawiera instrukcje, jak go używać. tphangout.com/?p=83
Raja Yogan

427

Używam następującego kodu, aby uzyskać pełną nazwę urządzenia. Pobiera ciągi modelu i producenta i łączy je, chyba że ciąg modelu zawiera już nazwę producenta (w niektórych telefonach tak jest):

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);
    }
} 

 

Oto kilka przykładów nazw urządzeń, które otrzymałem od użytkowników:

Samsung GT-S5830L
Motorola MB860
Sony Ericsson LT18i
LGE LG-P500
HTC Desire V
HTC Wildfire S A510e


Jest tam gdzieś lista, która zawiera wszystkie możliwe odpowiedzi, które można uzyskać z telefonu. Powiedz, czy musisz przekierować użytkownika, jak zainstalować coś na określonym typie telefonu lub sprzedać coś do określonego modelu.
evilfish

7
@evilfish Wypróbuj tę listę od Google: support.google.com/googleplay/answer/1727131
Idolon

Działa idealnie na zegarku, ponieważ potrzebowałem go na Android Wear.
Wahib Ul Haq,

116

Tak: Build.MODEL .


Zawsze daje mi „Android SDK zbudowany dla x86”, kiedy próbuję go z emulatorem. Nie można uzyskać nazwy modelu specjalnie w emulatorze o innej nazwie modelu.
Swathi

Tak, to model emulatora. Pamiętaj, że używa nawet podobnej nazwy dla pamięci wewnętrznej.
Cool Guy CG

34

W rzeczywistości nie jest to w 100% poprawne. To może dać ci Model (czasami liczby).
Otrzymasz od ciebie producenta telefonu (część twojego żądania HTC):

 Build.MANUFACTURER

W przypadku nazwy produktu:

 Build.PRODUCT

8
Uważam, że String name = Build.MANUFACTURER + " - " + Build.MODELjest to najbardziej przydatna kombinacja. Build.PRODUCT czasami używa nieoczekiwanej nazwy. Na przykład w Galaxy Nexus zwraca „takgu”. Z drugiej strony Build.MODEL to wartość dla użytkownika wyświetlana w obszarze Ustawienia-> Informacje o telefonie-> Numer modelu.
Mike Ortiz

1
Wiele zależy od producenta; Urządzenia HTC (Evo 4G, 4G LTE, 3D i Slide) używają tego, co powiedziałem powyżej.
Falcon165o

AXON 7 mini znajduje się na liście. Gdzie jest jednak AXON o regularnych rozmiarach?
Serge,

30

Dla tych, którzy szukają pełnej listy właściwości Buildtutaj, jest przykład dla 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

Możesz łatwo wyświetlić listę tych właściwości urządzenia w trybie debugowania za pomocą okna dialogowego „oceń wyrażenie” za pomocą kotlin:

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

14
String deviceName = android.os.Build.MODEL; // returns model name 

String deviceManufacturer = android.os.Build.MANUFACTURER; // returns manufacturer

Użyj metody Follow, aby programowo uzyskać model i producenta

  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);
    }

8

Poniższe ciągi znaków są przydatne, gdy chcesz pobrać producenta, nazwę urządzenia i / lub model:

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

8

Najwyraźniej musisz użyć listy od Google na https://support.google.com/googleplay/answer/1727131

Interfejsy API nie zwracają niczego, czego oczekuję ani niczego w Ustawieniach. Dla mojej Motoroli X to właśnie dostaję

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

Przechodzenie do strony wymienionej powyżej „duch” mapy do Moto X. Wygląda to może być odrobinę prostsze ...


AXON 7 mini znajduje się na liście. Gdzie jest jednak AXON o regularnych rozmiarach?
Serge

7

możesz użyć następującego kodu, aby uzyskać nazwę marki i model marki urządzenia.

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

3

Oto mój kod, aby uzyskać nazwę producenta, markę, wersję systemu operacyjnego i poziom wsparcia 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;
}

Wynik:

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

3

Wersja 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)
    }
}

Napisałem krótszą wersję ze capitalize stackoverflow.com/a/59158474/1446466
Sean

1

Zmieniono nieco kod Idolons. Spowoduje to pisanie wielkich liter po otrzymaniu modelu urządzenia.

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();
    }
}

1

Krótka wersja 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()

1
Build.DEVICE // The name of the industrial design.

Build.DEVICE Daje czytelną dla ludzi nazwę dla niektórych urządzeń niżBuild.MODEL

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

0

Możesz uzyskać nazwę urządzenia telefonicznego z

BluetoothAdapter

Jeśli telefon nie obsługuje Bluetooth, musisz skonstruować nazwę urządzenia

android.os.Build class

Oto przykładowy kod, aby uzyskać nazwę urządzenia telefonicznego.

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;
}

2
DZIĘKUJĘ CI!! Pamiętaj, że aby to zadziałało, wymagane jest zezwolenie BLUETOOTH.
user2923322,

-4

Możesz wypróbować następującą funkcję i zwrócić jej nazwę telefonu Model w postaci łańcucha.

public String phoneModel() {

    return Build.MODEL;
}

Ta odpowiedź nie poprawia się w żadnej z pozostałych odpowiedzi, które mówiły to samo i zostały tutaj rok temu.
Lynn Crumbling
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.