Como detectar tablets Android em geral. Agente de usuário?

103

Eu olhei em todos os lugares. Estamos usando um Motorola Zoom para fazer o teste do nosso tablet. O problema é que o Useragent Android é um Useragent geral e não há diferença entre o tablet Android e o Android móvel. Não quero ter como alvo apenas um dispositivo específico, como o Xoom Useragent, pois o Android provavelmente estará em vários tablets em um futuro próximo.

Estamos usando o Umbraco CMS e examinamos a solução 51Degrees.mobi e, no momento, isso não funcionará para as nossas necessidades. Talvez no futuro. Eu sei que a 51Degrees e algumas pessoas em Umbraco farão alguma integração em Umbraco, mas o projeto final provavelmente só será lançado em alguns meses.
Portanto, gostaríamos de detectar a string Useragent de um tablet Android e não direcioná-la para nosso site móvel como está atualmente.

Se alguém souber como detectar e Android Tablet em geral, não o dispositivo específico seria muito útil.

ClosDesign
fonte
2
Estou apenas supondo, mas talvez haja uma maneira de ver quão alta é a resolução de visualização também?
Phonon de
@Phonon, Sim, estamos tentando usar Javascript para enviar um valor res de volta ao servidor. Estamos tentando um __doPostBack, mas parece que não está enviando nosso valor de volta. Temos um valor de entrada oculto, ele mostra o lado do cliente, mas não o estamos recebendo de volta do lado do servidor.
ClosDesign
Não tenho certeza se posso ajudá-lo aqui.
Phonon

Respostas:

112

O problema é que o User-Agent Android é um User-Agent geral e não há diferença entre o tablet Android e o celular Android.

Isso está incorreto. Mobile Android tem a string "Mobile" no cabeçalho do agente do usuário. Tablet Android não.

Mas vale a pena mencionar que existem alguns tablets que relatam Safari "Mobile" no userAgent e este último não é a única / sólida forma de diferenciar entre Mobile e Tablet.

CommonsWare
fonte
3
você está certo. Eu só estava procurando uma string que contém Android. Tive que procurar a string que contém Android e! Mobile. Encontrei o artigo de Tim Bray sobre isso.
ClosDesign
6
@yoavf: Isso parece ter sido corrigido com a atualização do Android 3.1 do XOOM. Eu tenho um XOOM e acabei de testá-lo - sem "celular".
CommonsWare
27
Esta resposta não está totalmente correta. Existem alguns tablets - até mesmo o mais recente Kindle Fire - que relatam Safari "móvel" na string userAgent. Não parece haver uma maneira sólida de detectar tablet vs. telefone neste momento, a menos que seja uma combinação de userAgent e possível suporte para detecção de resolução.
vernonk
22
falso! Samsung Galaxy Tab é um tablet óbvio, mas tem "móvel" em seu agente de usuário
puchu
1
Acredito que a adição "móvel" foi com o Android 4, ainda há muitos dispositivos pré-4 ... Para o Android 2.x, presumo telefone, para 3.x, presumo que seja tablet (embora haja alguns falsos positivos) ... caso contrário, você pode testar para celular ...
Tracker1
20

@Carlos: Em seu artigo Tim Bray recomenda isso (assim como outro post do Google ), mas infelizmente não está sendo aplicado por todos os fabricantes de tablets.

... Recomendamos que os fabricantes de dispositivos de formato grande removam "Móvel" do Agente do Usuário ...

A maioria das strings de user agent de tablets Android que vi usa safari móvel, por exemplo, o Samsung Galaxy Tab:

Mozilla / 5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build / FROYO) AppleWebKit / 533.1 (KHTML, como Gecko) Versão / 4.0 Mobile Safari / 533.1

Portanto, no momento estou verificando nomes de dispositivos para detectar tablets Android. Contanto que existam poucos modelos no mercado, tudo bem, mas logo essa será uma solução feia.

Pelo menos no caso do XOOM, a parte móvel parece ter sumido:

Mozilla / 5.0 (Linux; U; Android 3.0; en-us; Xoom Build / HRI39) AppleWebKit / 534.13 (KHTML, como Gecko) Versão / 4.0 Safari / 534.13

Mas como atualmente só existem tablets com Andorid 3.x, verificar no Android 3 seria suficiente.

Bitwalker
fonte
1
você poderia postar a lista de dispositivos que você verificou e a codificação.
LTech
12

É melhor também detectar o user-agent “móvel”

Embora você ainda queira detectar “android” no User-Agent para implementar recursos específicos do Android, como otimizações de tela de toque, nossa mensagem principal é: Caso seu site para celular dependa de detecção de UA, detecte as strings “mobile” e "android", em vez de apenas "android", no User-Agent. Isso ajuda a atender adequadamente aos visitantes de seus celulares e tablets.

Detectando dispositivo Android via navegador

 < script language="javascript"> <!--
     var mobile = (/iphone|ipad|ipod|android|blackberry|mini|windows\sce|palm/i.test(navigator.userAgent.toLowerCase()));
              if (mobile) {
                  alert("MOBILE DEVICE DETECTED");
                  document.write("<b>----------------------------------------<br>")
                  document.write("<b>" + navigator.userAgent + "<br>")
                  document.write("<b>----------------------------------------<br>")
                  var userAgent = navigator.userAgent.toLowerCase();
                  if ((userAgent.search("android") > -1) && (userAgent.search("mobile") > -1))
                         document.write("<b> ANDROID MOBILE <br>")
                   else if ((userAgent.search("android") > -1) && !(userAgent.search("mobile") > -1))
                       document.write("<b> ANDROID TABLET <br>")
              }
              else
                  alert("NO MOBILE DEVICE DETECTED"); //--> </script>
Jorgesys
fonte
3
Isso funciona perfeitamente. Eu adicionei isso para iPad e iPhone / iPod. else if (userAgent.search("ipad") > -1) document.write("<b> iPad <br>") else if ((userAgent.search("iphone") > -1)||(userAgent.search("ipod") > -1)) document.write("<b> iPhone or iPod <br>")
Spencer Cole de
Como funciona para mozilla / 5.0 (linux; u; android 2.2; en-gb; gt-p1000 build / froyo) applewebkit / 533.1 (khtml, como gecko) versão / 4.0 mobile safari / 533.1 que tem a palavra 'móvel' nele para o Samsung Galaxy Tablet?
LTech
8

Você pode experimentar este script, pois não deseja direcionar apenas o Xoom. Não tenho um Xoom, mas deve funcionar.

function mobile_detect(mobile,tablet,mobile_redirect,tablet_redirect,debug) {
var ismobile = (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(navigator.userAgent.toLowerCase()));
var istablet = (/ipad|android|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(navigator.userAgent.toLowerCase()));

if (debug == true) {
    alert(navigator.userAgent);
}

if (ismobile && mobile==true) {
    if (debug == true) {
        alert("Mobile Browser");
    }
    window.location = mobile_redirect;
} else if (istablet && tablet==true) {
    if (debug == true) {
        alert("Tablet Browser");
    }
    window.location = tablet_redirect;
}
}

Criei um projeto no github. Confira - https://github.com/codefuze/js-mobile-tablet-redirect . Sinta-se à vontade para enviar problemas se houver algo errado!

CodeFuze
fonte
1
Isso não funcionará com versões do Android> 3.0, como ICS (4.0). Acho que a resposta aceita é a certa - verifique se "Mobile Safari" está no useragent.
Suman
Não tenho certeza sobre outros Kindles, mas o Kindle Fire 1 NÃO tem 'kindle' em sua string de agente do usuário - nem contém 'android'; as únicas pistas são as palavras 'Silk' e 'Silk-Accelerated'.
mklement0
6

Depois de detectar o Android no agente do usuário, é assim que faço a diferença entre navegadores de tablets e smartphones (usa Python, mas é igualmente simples para outras linguagens de programação):

if ("Android" in agent):
  if ("Mobile" in agent):
    deviceType = "Phone"
  else:
    deviceType = "Tablet"

ATUALIZADO: para refletir o uso do Chrome no Android, conforme comentários abaixo.

Suman
fonte
Por que não procurar "Mobile" no agente?
Eren Tantekin
Acho que também pode funcionar, mas acho que pode ser perigoso pesquisar apenas por "Celular" - pode haver dispositivos com nomes, como "HTC Mobile" etc. Acho que essa é a abordagem recomendada.
Suman
1
Agora que o Google lançou o Chrome para Android, sua abordagem pode ficar um pouco problemática. Porque o Chrome no Android irá se reportar como "Chrome Mobile" em vez do usual "Mobile Safari" como o navegador padrão do Android está fazendo. Para algumas recomendações oficiais: developers.google.com/chrome/mobile/docs/user-agent
Eren Tantekin
4

Com base nas sequências de agentes neste site:

http://www.webapps-online.com/online-tools/user-agent-strings

Este resultado surgiu:
Primeiro:

Todos os dispositivos Tablet têm:
1. Tablet
2. iPad

Segundo:

Todos os aparelhos de telefone têm:
1. Celular
2. Telefone

Terceiro:

Dispositivos de tablet e telefone têm:
1. Android

Se você puder detectar nível por nível, acho que o resultado é 90% verdadeiro. Como canais de dispositivos do SharePoint.

Jalali Shakib
fonte
2

Aqui está o que eu uso:

public static boolean onTablet()
    {
    int intScreenSize = getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;

    return (intScreenSize == Configuration.SCREENLAYOUT_SIZE_LARGE) // LARGE
    || (intScreenSize == Configuration.SCREENLAYOUT_SIZE_LARGE + 1); // Configuration.SCREENLAYOUT_SIZE_XLARGE
    }
Regis St-Gelais
fonte
2

Embora não possamos dizer se alguns tablets omitem "móvel", muitos, incluindo o Samsung Galaxy Tab, fazem têm celular em seu user-agent, tornando impossível detectar entre um tablet android e telefone android, sem recorrer a verificação especificidades modelo. Este IMHO é uma perda de tempo, a menos que você planeje atualizar e expandir sua lista de dispositivos mensalmente.

Infelizmente, a melhor solução aqui é reclamar com o Google sobre isso e fazer com que eles consertem o Chrome para Android para que ele adicione algum texto para identificar entre um dispositivo móvel e um tablet. Inferno, mesmo uma única letra M OU T em um local específico da string seria o suficiente, mas acho que faz muito sentido.

D Langhorne
fonte
1

O Xoom tem a palavra Xoom no agente de usuário: Mozilla / 5.0 (Linux; U; Android 3.0.1; en-us; Xoom Build / HRI66) AppleWebKit / 534.13 (KHTML, como Gecko) Versão / 4.0 Safari / 534.13

Galaxy Tab tem "Mobile" no user-agent: Mozilla / 5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build / FROYO) AppleWebKit / 533.1 (KHTML, como Gecko) Versão / 4.0 Mobile Safari / 533.1

Portanto, é fácil detectar o Xoom, difícil detectar se uma versão específica do Android é móvel ou não.

travyo
fonte
1

A maioria dos tablets modernos executa o honeycomb também conhecido como 3.x Nenhum telefone executa o 3.x por padrão. A maioria dos tablets que atualmente executam 2.x tem menos capacidade e pode ser melhor quando apresentada a um site móvel de qualquer maneira. Eu sei que não é perfeito .. mas acho que é muito mais preciso do que a ausência de celular ..

gjr
fonte
1
Na verdade, os telefones não podem nem rodar 3.x porque era uma versão do Android apenas para tablet e não era de código aberto.
Eren Tantekin
1

Embora o Android móvel possa ter "móvel" em sua string de agente do usuário, e se estiver usando o Opera Mobile para Android em um tablet? Ele ainda terá "móvel" em sua string de agente do usuário, mas deve exibir sites do tamanho de um tablet. Você precisará testar "móvel" que não seja precedido por "ópera" em vez de apenas "móvel"

ou você pode simplesmente esquecer o Opera Mobile.

GeeItSomeLaldy
fonte
1
O Opera mobile não usa 'mobile' na string do usuário, ele usa 'mobi'. Veja aqui
Ian Stanway
2
O Opera Mobile para celulares tem "Opera Mobi" na string do agente do usuário, mas o Opera Mobile para tablets tem "Opera Tablet" na string do agente do usuário.
tagawa
1

Eu recomendaria usar o Categorizr para detectar se o usuário está em um tablet. Você pode ver os resultados do teste categorizr aqui .

híbrido
fonte
1

Se você usar a ausência de "Mobile", é quase correto. Mas há HTC Sensation 4G (4,3 polegadas com android 2.X) que não envia a palavra-chave Mobile.

A razão pela qual você pode querer tratá-lo separadamente é devido a iframesetc.

zel
fonte
0

O 51Degrees beta, 1.0.1.6 e a versão estável mais recente 1.0.2.2 (28/4/2011) agora têm a capacidade de farejar o tablet. Basicamente ao longo das linhas de:

string capability = Request.Browser["is_tablet"];

Espero que isso ajude você.

Joey Schluchter
fonte
0

Experimente o OpenDDR , é gratuito ao contrário da maioria das outras soluções mencionadas.

Werner Keil
fonte