Récupérer le User-Agent par programmation
Est-il un moyen de récupérer le user-agent du Navigateur, sans avoir un WebView
en activité?
Je sais que c'est possible de le faire via WebView
:
WebView view = (WebView) findViewById(R.id.someview);
String ua = view.getSettings().getUserAgentString() ;
Mais dans mon cas, je n'ai pas de/besoin d'une webview objet et je ne veux pas créer juste pour récupérer chaîne de l'agent utilisateur.
Vous devez vous connecter pour publier un commentaire.
Si vous n'avez pas ont, vous pouvez essayer de le prendre comme ça
Edit-
La doc pour
getUserAgentString()
ditRetour de la WebView de la chaîne de l'agent utilisateur.
Donc je ne pense pas que vous pouvez obtenir, sauf si vous déclarez un. Quelqu'un me corrige si je me trompe
Il y a un moyen beaucoup plus simple si vous êtes sur Android 2.1 ou supérieur. Accordé ce n'est pas exactement la même chaîne de l'Agent Utilisateur qu'une webview serait de retour, mais pourrait bien vous servir assez pour vos besoins.
Comme un avantage supplémentaire à tirer en mode web, vous pouvez l'utiliser depuis n'importe quel thread (et pas seulement le thread d'INTERFACE utilisateur).
Il y a un système de propriété appelée http.l'agent, qui peut être utilisé pour récupérer la chaîne de l'Agent Utilisateur.
Voir Obtenir par programme Chaîne de l'Agent Utilisateur pour plus de détails.
J'ai l'habitude d'utiliser solution proposé par DeRagan. Mais il s'est avéré que la création d'un seul
WebView
instance démarre un thread "WebViewCoreThread" qui reste à l'arrière-plan jusqu'à ce que l'application est arrêtée par le système. Peut-être qu'il ne veut pas consommer trop de ressources, mais je ne l'aime pas de toute façon. J'ai donc utiliser la méthode légèrement différente maintenant, qui tente d'éviter WebViewCoreThread création:Il crée
WebSettings
instance directement à l'aide de paquet-visible constructeur et si ce n'est pas disponible pour une raison quelconque (par exemple en raison de changements de l'API dans les futures versions d'Android) - en silence revient à "WebView" comme de la solution.Mise à JOUR
Comme indiqué par @Skywalker5446, à partir de Android 4.2/API 17, il y a une méthode statique publique pour obtenir de l'agent utilisateur par défaut de la valeur. J'ai mis à jour mon code pour utiliser cette méthode sur les plateformes prises en charge.
WebSettings
est maintenant abstrait, bien qu'il y est unWebSettingsClassic
, appelant l'Api privées est toujours pas une manière élégante, il va échouer dans l'avenir et vous ne pouvez pas fixer sans une mise à niveau.WebSettings.class.getDeclaredConstructor(Context.class, WebView.class)
je suis maintenant la charpie avertissement "Cannot resolve constructor with specified argument types
"Depuis Android 2.1, vous devez utiliser Système.getProperty("http".l'agent");
Vous aussi n'avez pas besoin de créer une WebView premier ET , c'est l'avantage,
vous pouvez l'utiliser à l'intérieur d'un non-uithread.
salutations steve
Grâce à Idolon la réponse de mon app processus en arrière-plan.
Mais de toute façon sur HTC Inspire 4G à partir de AT&T qui s'exécute 2.3.3, il va à l'instruction catch et il peut être impossible d'exécuter sur le thread d'arrière-plan.
Ma solution pour cela est la suivante:
(en supposant que vous avez mContext et mUserAgent dans le domaine)
quit()
le Looper etjoin()
le fil ou l'utilisationwait()
etnotify()
/notifyAll()
de sorte que mUserAgent est garanti d'être modifié. Actuellement, la méthode pourrait revenir avant que l'enfant fil des mises à jour mUserAgent.C'est une solution mise à jour sur la base des réponses qui fonctionne lorsque vous compilez pour KitKat. Maintenant, le
WebSettings
classe est abstraite et laWebSettingsClassic
classe a été supprimée.