通过截击调整Android中的用户代理

通过截击调整Android中的用户代理,android,http,http-headers,user-agent,android-volley,Android,Http,Http Headers,User Agent,Android Volley,我想知道如何调整http请求中的标准用户代理。我正在使用截击库,我知道如何 设置新的用户代理 以字符串形式检索默认用户代理(例如“Dalvik/1.6.0(Linux;U;Android 4.0.2;sdk构建/ICS_MR0”)=>System.getProperty(“http.agent”) 我不知道的是: 如何获取这个用户代理构建的单个元素,因此我只能用自定义字符串替换字符串“Dalvik/1.6.0” 这是可能的,还是我必须更换字符串 Thx为了为通过volley发送的所有请求

我想知道如何调整http请求中的标准用户代理。我正在使用截击库,我知道如何

  • 设置新的用户代理
  • 以字符串形式检索默认用户代理(例如“Dalvik/1.6.0(Linux;U;Android 4.0.2;sdk构建/ICS_MR0”)=>System.getProperty(“http.agent”)
我不知道的是:

  • 如何获取这个用户代理构建的单个元素,因此我只能用自定义字符串替换字符串“Dalvik/1.6.0”
这是可能的,还是我必须更换字符串


Thx

为了为通过volley发送的所有请求全局设置用户代理,以下是我的解决方案:

在初始化截取请求队列时,不要使用方便的方法
volley.newRequestQueue(Context);
,而是使用以下代码段:

    private RequestQueue makeRequestQueue(Context context) {
        DiskBasedCache cache = new DiskBasedCache(new File(context.getCacheDir(), DEFAULT_CACHE_DIR), DISK_CACHE_SIZE);
        BasicNetwork network = new BasicNetwork(new MyHurlStack());
        RequestQueue queue = new RequestQueue(cache, network);
        queue.start();
        return queue;
    }

    public static class MyHurlStack extends HurlStack {

        @Override
        public HttpResponse executeRequest(Request<?> request, Map<String, String> additionalHeaders) throws IOException, AuthFailureError {
            if (additionalHeaders == null || Collections.emptyMap().equals(additionalHeaders) {
                 additionalHeaders = new HashMap<>();
            }
            additionalHeaders.put("User-Agent", "test_user_agent_in_volley");
            return super.executeRequest(request, additionalHeaders);
        }
    }
private RequestQueue makeRequestQueue(上下文){
DiskBasedCache=新的DiskBasedCache(新文件(context.getCacheDir(),默认为\u cache\u DIR),磁盘\u cache\u大小);
基本网络=新的基本网络(新的MyHurlStack());
RequestQueue=新的RequestQueue(缓存、网络);
queue.start();
返回队列;
}
公共静态类MyHurlStack扩展了HurlStack{
@凌驾
公共HttpResponse executeRequest(请求-请求,映射附加标头)引发IOException,AuthFailureError{
if(additionalHeaders==null | | Collections.emptyMap().equals(additionalHeaders){
additionalHeaders=newHashMap();
}
附加标题。put(“用户代理”、“测试用户代理”);
返回super.executeRequest(请求、附加标头);
}
}
此解决方案假定您的目标api级别>=9,因此我们使用HurlStack

之所以这样做,是因为在
HurlStack.executeRequest(请求请求,映射附加标头)
方法中,添加到附加标头的内容稍后将添加到HttpUrlConnection请求属性中,如
connection.addRequestProperty(headerName,Map.get(headerName));
是, 构建。指纹包含您需要的所有信息,

要获取各个部分,请使用各个常量字符串

有关详细的操作系统版本信息,请使用

System.getProperty(“http.agent”)
返回如下内容:

Dalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)
可以使用和的组合来构建此应用程序的所有部分

这是在模拟器上运行的android.os.Build中的一个示例:

Build.BOARD = "goldfish_x86"
Build.BOOTLOADER = "unknown"
Build.BRAND = "google"
Build.DEVICE = "generic_x86"
Build.DISPLAY = "sdk_gphone_x86-userdebug 9 PSR1.180720.075 5124027 dev-keys"
Build.FINGERPRINT = "google/sdk_gphone_x86/generic_x86:9/PSR1.180720.075/5124027:userdebug/dev-keys"
Build.HARDWARE = "ranchu"
Build.HOST = "abfarm904"
Build.ID = "PSR1.180720.075"
Build.MANUFACTURER = "Google"
Build.MODEL = "Android SDK built for x86"
Build.PRODUCT = "sdk_gphone_x86"
Build.SUPPORTED_32_BIT_ABIS = {"x86"} 
Build.SUPPORTED_64_BIT_ABIS = {} 
Build.SUPPORTED_ABIS = {"x86"} 
Build.TAGS = "dev-keys"
Build.TIME = 1541887073000
Build.TYPE = "userdebug"
Build.USER = "android-build"
Build.UNKNOWN = "unknown"
Build.VERSION.BASE_OS = ""
Build.VERSION.CODENAME = "REL"
Build.VERSION.INCREMENTAL = "5124027"
Build.VERSION.PREVIEW_SDK_INT = 0
Build.VERSION.RELEASE = "9"
Build.VERSION.SDK_INT = 28
Build.VERSION.SECURITY_PATCH = "2018-09-05"
根据谷歌的文档,这些属性始终由Dalvik VM提供:

file.separator = /
java.class.path = .
java.class.version = 50.0
java.compiler = Empty
java.ext.dirs = Empty
java.home = /system
java.io.tmpdir = /sdcard
java.library.path = /vendor/lib:/system/lib
java.vendor = The Android Project
java.vendor.url = http://www.android.com/
java.version = 0
java.specification.version = 0.9
java.specification.vendor = The Android Project
java.specification.name = Dalvik Core Library
java.vm.version = 1.2.0
java.vm.vendor = The Android Project
java.vm.name = Dalvik
java.vm.specification.version = 0.9
java.vm.specification.vendor = The Android Project
java.vm.specification.name = Dalvik Virtual Machine Specification
line.separator = \n
os.arch = armv7l
os.name = Linux
os.version = 2.6.32.9-g103d848
path.separator = :
user.dir = /
user.home = Empty
user.name = Empty
因此,默认用户代理似乎由以下部分组成:

System.getProperty("java.vm.name")    // Dalvik
System.getProperty("java.vm.version") // 2.1.0
System.getProperty("os.name")         // Linux
"U"                                   // not sure where to get this
"Android"                             // or this, probably safe to hard code though
Build.VERSION.RELEASE                 // 9
Build.MODEL                           // Android SDK built for x86
Build.ID                              // PSR1.180720.075

我只知道如何通过使用System.getProperty()和“java.vm.name”、“java.vm.version”和“os.name”来获取“Dalvik”、“1.6.0”和“Linux”部分。如何获取其余部分?
System.getProperty("java.vm.name")    // Dalvik
System.getProperty("java.vm.version") // 2.1.0
System.getProperty("os.name")         // Linux
"U"                                   // not sure where to get this
"Android"                             // or this, probably safe to hard code though
Build.VERSION.RELEASE                 // 9
Build.MODEL                           // Android SDK built for x86
Build.ID                              // PSR1.180720.075