Obter modelo de telefone Android programaticamente

355

Gostaria de saber se existe uma maneira de ler o modelo de telefone programaticamente no Android.

Gostaria de obter uma string como HTC Dream, Milestone, Sapphire ou qualquer outra coisa ...

Andrea Baccega
fonte

Respostas:

328

Em muitos dispositivos populares, o nome de mercado do dispositivo não está disponível. Por exemplo, sobre o Samsung Galaxy S6 o valor Build.MODELpoderia ser "SM-G920F", "SM-G920I"ou "SM-G920W8".

Criei uma pequena biblioteca que obtém o nome do mercado (consumidor amigável) de um dispositivo. Ele recebe o nome correto para mais de 10.000 dispositivos e é constantemente atualizado. Se você deseja usar minha biblioteca, clique no link abaixo:

Biblioteca AndroidDeviceNames no Github


Se você não deseja usar a biblioteca acima, esta é a melhor solução para obter um nome de dispositivo amigável ao consumidor:

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

Exemplo do meu Verizon HTC One M8:

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

Resultado:

HTC6525LVW

HTC One (M8)

Jared Rummler
fonte
19
Obrigado Jared. Eu precisava disso hoje, mas o Xamarin.Android traduziu seu arquivo para C #. Se alguém mais precisar, você pode encontrá-lo aqui. gist.github.com/mohibsheth/5e1b361ae49c257b8caf
Mohib Sheth
11
Existe uma maneira de obter o nome do dispositivo "legível por humanos" como "Xperia Z3" ou "Galaxy S3" sem essa classe de dispositivos? Não gosto de usar uma lista estática de todos os dispositivos para garantir que todos os dispositivos futuros sejam suportados.
Radon8472
11
@ Radon8472 Você já tentou o método estático de fábrica acima mencionado getDeviceName()? Se isso não lhe der os resultados que você procura, não há uma solução melhor que eu conheça.
precisa
@ Jared: Eu já tenho um nome de dispositivo como os resultados de 'getDeviceName ()', mas eu gosto de exibir o nome que os usuários finais conhecem em suas lojas acessíveis :( #
Radon8472
11
Oi pessoal Eu escrevi um módulo angular para este chamado ng-fone usando a lista de Jared. O link abaixo fornece instruções sobre como usá-lo. tphangout.com/?p=83
Raja Yogan
427

Eu uso o código a seguir para obter o nome completo do dispositivo. Ele obtém as seqüências de modelo e fabricante e as concatena, a menos que a sequência de modelos já contenha o nome do fabricante (em alguns telefones):

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

 

Aqui estão alguns exemplos de nomes de dispositivos que recebi dos usuários:

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

Idolon
fonte
Existe uma lista em algum lugar que contém todas as respostas possíveis que você pode tirar do telefone. Diga se você precisa redirecionar um usuário para instalar algo em um tipo de telefone específico ou vender algo para um modelo específico.
Evil2 /
7
@evilfish Tente esta lista do Google: support.google.com/googleplay/answer/1727131
Idolon
Funciona perfeitamente no relógio, porque eu precisava dele para o Android Wear.
Wahib Ul Haq
116

Sim: Build.MODEL .

Mirko N.
fonte
Sempre me dá o "Android SDK criado para x86" quando eu tento com emulador. Não é possível obter o nome do modelo especificamente no emulador executado com um nome de modelo diferente.
Swathi
Sim, esse é o modelo do emulador. Observe que ele ainda usa um nome semelhante para o armazenamento interno.
Indivíduo fresco CG
34

Na verdade, isso não é 100% correto. Isso pode lhe dar o modelo (alguns números).
Você receberá o fabricante do telefone (parte HTC da sua solicitação):

 Build.MANUFACTURER

Para um nome de produto:

 Build.PRODUCT
Falcon165o
fonte
8
Eu descobri que essa String name = Build.MANUFACTURER + " - " + Build.MODELé a combinação mais útil. Às vezes, Build.PRODUCT usa um nome inesperado. Por exemplo, no Galaxy Nexus, ele retorna "takgu". Build.MODEL, por outro lado, é o valor voltado para o usuário exibido em Configurações-> Sobre o telefone-> Número do modelo.
Mike Ortiz
11
Muito disso depende do fabricante; Os dispositivos HTC (Evo 4G, 4G LTE, 3D e Slide) usam o que afirmei acima.
precisa saber é o seguinte
O AXON 7 mini está na lista. No entanto, onde é tamanho regular AXON?
Serge
30

Para quem procura uma lista completa de propriedades Buildaqui é um exemplo para o 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

Você pode listar facilmente essas propriedades para o seu dispositivo no modo de depuração usando o diálogo "avaliar expressão" usando o kotlin:

android.os.Build::class.java.fields.map { "Build.${it.name} = ${it.get(it.name)}"}.joinToString("\n")
ruX
fonte
14
String deviceName = android.os.Build.MODEL; // returns model name 

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

Use o método a seguir para obter o modelo e o fabricante programaticamente

  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);
    }
Ajay Pandya
fonte
8

As seguintes seqüências de caracteres são úteis quando você deseja recuperar o fabricante, o nome do dispositivo e / ou o modelo:

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

Aparentemente, você precisa usar a lista do Google em https://support.google.com/googleplay/answer/1727131

As APIs não retornam nada que eu espero ou algo nas configurações. Para o meu Motorola X, é isso que recebo

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

Indo para a página mencionada acima, mapas "fantasmas" para o Moto X. Parece que isso poderia ser um pouco mais simples ...

Edwin Evans
fonte
O AXON 7 mini está na lista. No entanto, onde está o AXON de tamanho regular?
Serge
7

você pode usar o código a seguir para obter o nome e o modelo da marca do dispositivo.

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

Aqui está o meu código, para obter fabricante, nome da marca, versão do sistema operacional e nível de API de suporte

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

Resultado:

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

Versão 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)
    }
}
Francisco Pereira
fonte
Eu publiquei uma versão mais curta com de Kotlin capitalize stackoverflow.com/a/59158474/1446466
Sean
1

Os ídolos alterados codificam um pouco. Isso irá colocar em maiúsculas as palavras ao obter o modelo do dispositivo.

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

Versão curta do 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()
Sean
fonte
1
Build.DEVICE // The name of the industrial design.

Build.DEVICE Fornece o nome legível por humanos para alguns dispositivosBuild.MODEL

Build.DEVICE = OnePlus6
Build.MANUFACTURER = OnePlus
Build.MODEL = ONEPLUS A6003
majurageerthan
fonte
0

Você pode obter o nome do dispositivo do telefone na

BluetoothAdapter

Caso o telefone não seja compatível com Bluetooth, você deverá construir o nome do dispositivo a partir de

classe android.os.Build

Aqui está o código de exemplo para obter o nome do dispositivo do telefone.

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;
}
Sridhar Nalam
fonte
2
OBRIGADO!! Observe que a permissão BLUETOOTH é necessária para que isso funcione.
user2923322
-4

Você pode tentar seguir a função e retornar seu nome phoneModel no formato de sequência.

public String phoneModel() {

    return Build.MODEL;
}
Quantum4U
fonte
Esta resposta não melhora nenhuma das outras respostas que disseram a mesma coisa e foram deixadas aqui há um ano.
Lynn desintegração