android - Qual é a diferença entre setWebViewClient vs.setWebChromeClient?



(3)

Eu sinto que esta pergunta precisa de um pouco mais de detalhes. Minha resposta é inspirada na programação Android, The Nerd Ranch Guide (2ª edição).

Por padrão , o JavaScript está desativado no WebView. Você nem sempre precisa ativá-lo, mas, para alguns aplicativos, pode ser necessário.

Carregar o URL tem que ser feito depois de configurar o WebView, então você faz isso por último. Antes disso, ative o JavaScript chamando getSettings() para obter uma instância de WebSettings e chamando WebSettings.setJavaScriptEnabled(true) . WebSettings é a primeira das três maneiras que você pode modificar seu WebView. Ele tem várias propriedades que você pode definir, como a string do agente do usuário e o tamanho do texto.

Depois disso, você configura seu WebViewClient. WebViewClient é uma interface de eventos. Ao fornecer sua própria implementação do WebViewClient, você pode responder a eventos de renderização. Por exemplo, você pode detectar quando o renderizador começa a carregar uma imagem de uma determinada URL ou decidir se deseja reenviar uma solicitação POST ao servidor.

WebViewClient tem muitos métodos que você pode substituir, a maioria dos quais você não irá lidar. No entanto, você precisa substituir a implementação padrão do WebViewClient de shouldOverrideUrlLoading(WebView, String) . Esse método determina o que acontecerá quando um novo URL for carregado no WebView, como se você pressionasse um link. Se você retornar true, você está dizendo: "Não manipule esta URL, eu estou lidando com isso sozinho". Se você retornar falso, você está dizendo: "Vá em frente e carregue esta URL, WebView, não estou fazendo nada com isso .

A implementação padrão dispara uma intenção implícita com a URL, assim como você fez anteriormente. Agora, porém, isso seria um problema grave. A primeira coisa que alguns aplicativos da Web fazem é redirecioná-lo para a versão móvel do site. Com o WebViewClient padrão, isso significa que você é imediatamente enviado ao navegador da Web padrão do usuário. Isso é exatamente o que você está tentando evitar. A correção é simples - apenas sobrescreva a implementação padrão e retorne false.

Use WebChromeClient para enfeitar as coisas Desde que você está tomando o tempo para criar seu próprio WebView, vamos enfeitá-lo um pouco adicionando uma barra de progresso e atualizando a legenda da barra de ferramentas com o título da página carregada.

Para ligar o ProgressBar, você usará o segundo retorno de chamada no WebView: WebChromeClient .

WebViewClient é uma interface para responder a eventos de renderização; O WebChromeClient é uma interface de eventos para reagir a eventos que devem alterar elementos do chrome em torno do navegador. Isso inclui alertas JavaScript, favicons e, claro, atualizações para o progresso do carregamento e o título da página atual.

Conecte-se no onCreateView(…) . Usando o WebChromeClient para incrementar as coisas Atualizações de progresso e atualizações de título têm seu próprio método de retorno de chamada, onProgressChanged(WebView, int) e onReceivedTitle(WebView, String) . O progresso que você recebe de onProgressChanged(WebView, int) é um inteiro de 0 a 100. Se for 100, você sabe que a página acabou de ser carregada, então você oculta a ProgressBar definindo sua visibilidade para View.GONE .

Disclaimer: Esta informação foi tirada da programação Android: The Big Nerd Ranch Guide com a permissão dos autores. Para mais informações sobre este livro ou para comprar uma cópia, visite bignerdranch.com.

Qual é a diferença entre setWebViewClient vs. setWebChromeClient no Android?


Do código fonte :

// Instance of WebViewClient that is the client callback.
private volatile WebViewClient mWebViewClient;
// Instance of WebChromeClient for handling all chrome functions.
private volatile WebChromeClient mWebChromeClient;

// SOME OTHER SUTFFF.......

/**
 * Set the WebViewClient.
 * @param client An implementation of WebViewClient.
 */
public void setWebViewClient(WebViewClient client) {
    mWebViewClient = client;
}

/**
 * Set the WebChromeClient.
 * @param client An implementation of WebChromeClient.
 */
public void setWebChromeClient(WebChromeClient client) {
    mWebChromeClient = client;
}

O uso do WebChromeClient permite manipular diálogos, favicons, títulos e o progresso do Javascript. Dê uma olhada neste exemplo: Adicionando suporte alert () a um WebView

À primeira vista, existem muitas diferenças WebViewClient & WebChromeClient . Mas, basicamente: se você está desenvolvendo um WebView que não requer muitos recursos, mas renderizando HTML, você pode simplesmente usar um WebViewClient . Por outro lado, se você quiser (por exemplo) carregar o favicon da página que está renderizando, você deve usar um objeto WebChromeClient e substituir o onReceivedIcon(WebView view, Bitmap icon) .

Na maioria das vezes, se você não quer se preocupar com essas coisas ... você pode fazer isso:

webView= (WebView) findViewById(R.id.webview); 
webView.setWebChromeClient(new WebChromeClient()); 
webView.setWebViewClient(new WebViewClient()); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.loadUrl(url); 

E o seu WebView (em teoria) terá todos os recursos implementados (como o navegador nativo do Android).


Outra maneira é usar /sys/class/android_usb/android0/iSerialem um aplicativo sem qualquer permissão.

[email protected]:~$ adb shell ls -l /sys/class/android_usb/android0/iSerial
-rw-r--r-- root     root         4096 2013-01-10 21:08 iSerial
[email protected]:~$ adb shell cat /sys/class/android_usb/android0/iSerial
0A3CXXXXXXXXXX5

Para fazer isso em Java, basta usar um FileInputStream para abrir o arquivo iSerial e ler os caracteres. Apenas certifique-se de envolvê-lo em um manipulador de exceções, porque nem todos os dispositivos possuem esse arquivo.

Pelo menos os seguintes dispositivos são conhecidos por terem este arquivo legível:

  • Galaxy Nexus
  • Nexus S
  • Motorola Xoom 3G
  • Toshiba AT300
  • HTC One V
  • Mini MK802
  • Samsung Galaxy S II

Você também pode ver o meu post do blog Vazando o número de série do hardware do Android para aplicativos não privilegiados, onde discuto quais outros arquivos estão disponíveis para obter informações.





android webviewclient webchromeclient