使用Volley在Android中调整用户代理

问题描述 投票:2回答:3

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

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

我不知道的是:

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

这是可能的,还是我必须更换字符串?

谢谢

android http http-headers user-agent android-volley
3个回答
1
投票

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

在初始化排球请求队列时,请使用以下代码段,而不是使用方便的方法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);
        }
    }

此解决方案假设您的目标是api级别> = 9,因此我们使用HurlStack

这样做的原因是因为在HurlStack.executeRequest(Request<?> request, Map<String, String> additionalHeaders)方法中,您添加到additionalHeaders的内容稍后会被添加到HttpUrlConnection请求属性中,如connection.addRequestProperty(headerName, map.get(headerName));中所示


0
投票

是的,Build.FINGERPRINT包含您需要的所有信息,https://developer.android.com/reference/android/os/Build.html

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

有关OS版本信息的详细信息,请使用Build.VERSION

import android.util.Log;
import android.os.Bundle;
import android.os.Build;
public class MainActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            Log.i("Build","BOARD = "+Build.BOARD);
            Log.i("Build","BOOTLOADER = "+Build.BOOTLOADER);
            Log.i("Build","BRAND = "+Build.BRAND);
            Log.i("Build","CPU_ABI = "+Build.CPU_ABI);
            Log.i("Build","CPU_ABI2 = "+Build.CPU_ABI2);
            Log.i("Build","DEVICE = "+Build.DEVICE);
            Log.i("Build","DISPLAY = "+Build.DISPLAY);
            Log.i("Build","FINGERPRINT = "+Build.FINGERPRINT);
            Log.i("Build","HARDWARE = "+Build.HARDWARE);
            Log.i("Build","HOST = "+Build.HOST);
            Log.i("Build","ID = "+Build.ID);
            Log.i("Build","MANUFACTURER = "+Build.MANUFACTURER);
            Log.i("Build","MODEL = "+Build.MODEL);
            Log.i("Build","PRODUCT = "+Build.PRODUCT);
            Log.i("Build","RADIO = "+Build.RADIO);
            Log.i("Build","SERIAL = "+Build.SERIAL);
            Log.i("Build","TAGS = "+Build.TAGS);
            Log.i("Build","TYPE = "+Build.TYPE);
            Log.i("Build","USER = "+Build.USER);
            Log.i("Build","BASE_OS = "+Build.VERSION.BASE_OS);
            Log.i("Build","CODENAME = "+ Build.VERSION.CODENAME);
            Log.i("Build","INCREMENTAL = "+ Build.VERSION.INCREMENTAL);
            Log.i("Build","RELEASE = "+ Build.VERSION.RELEASE);
            Log.i("Build","SDK = "+ Build.VERSION.SDK);
            Log.i("Build","SECURITY_PATCH = "+ Build.VERSION.SECURITY_PATCH);
            Log.i("$TAG#",Build.FINGERPRINT);
    }
}

0
投票

System.getProperty("http.agent")返回的内容如下:

Dalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)

使用android.os.Buildjava.lang.System.getProperty()的组合可以构建其中的所有部分。

这是在模拟器上运行的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"

根据Google的文档,这些属性始终由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
© www.soinside.com 2019 - 2024. All rights reserved.