有没有一种方法可以在不使用WebView的情况下检索浏览器的用户代理?
我知道可以通过WebView获得它
WebView view = (WebView) findViewById(R.id.someview);
String ua = view.getSettings().getUserAgentString() ;但是在我的例子中,我没有/不需要一个webview对象,我也不想仅仅为了检索用户代理字符串而创建它。
发布于 2010-09-02 18:21:48
如果你没有 one,你可以试着这样做
String ua=new WebView(this).getSettings().getUserAgentString();编辑-
getUserAgentString()的医生说
返回WebView的用户代理字符串。
所以我不认为你可以得到它,除非你声明一个。如果我错了,有人会纠正我
发布于 2012-09-07 16:13:50
如果你使用的是Android 2.1或更高版本,有一个简单得多的方法。当然,这与webview返回的User Agent字符串并不完全相同,但可能足以满足您的需求。
作为从web视图中提取的另一个优势,您可以在任何线程(不仅仅是UI线程)中使用它。
有一个名为http.agent的系统属性,可用于检索用户代理字符串。
String userAgent = System.getProperty("http.agent");有关更多详细信息,请参阅Programmatically get User-Agent String。
发布于 2011-03-10 22:56:09
我曾经使用过DeRagan提出的solution。但事实证明,创建单个WebView实例会启动一个线程"WebViewCoreThread“,该线程会一直在后台运行,直到系统终止应用程序为止。也许它不会消耗太多资源,但无论如何我都不喜欢它。因此,我现在使用的方法略有不同,它试图避免创建WebViewCoreThread:
// You may uncomment next line if using Android Annotations library, otherwise just be sure to run it in on the UI thread
// @UiThread
public static String getDefaultUserAgentString(Context context) {
if (Build.VERSION.SDK_INT >= 17) {
return NewApiWrapper.getDefaultUserAgent(context);
}
try {
Constructor<WebSettings> constructor = WebSettings.class.getDeclaredConstructor(Context.class, WebView.class);
constructor.setAccessible(true);
try {
WebSettings settings = constructor.newInstance(context, null);
return settings.getUserAgentString();
} finally {
constructor.setAccessible(false);
}
} catch (Exception e) {
return new WebView(context).getSettings().getUserAgentString();
}
}
@TargetApi(17)
static class NewApiWrapper {
static String getDefaultUserAgent(Context context) {
return WebSettings.getDefaultUserAgent(context);
}
}它直接使用包可见的构造函数创建WebSettings实例,如果由于某种原因(例如,由于未来安卓版本中的API更改)而不可用,则会默默地退回到“类似WebView”的解决方案。
更新
正如@Skywalker5446所指出的,从Android4.2/API17开始,有一个公共的静态方法来获取默认的用户代理值。我已经更新了我的代码,以便在支持的平台上使用该方法。
https://stackoverflow.com/questions/3626071
复制相似问题