为什么 Android Volley 无法检索 Android Q 上的数据?

Why does Android Volley fail to retrieve data on Android Q?

我正在使用 Volley 1.1.1 通过 URL 检索一些 JSON 数据。

我的示例取自官方 Android 文档:Send a simple request - 虽然它略有改动以使其更简单(请参见下面的代码)。

清单权限

我已经在我的清单中添加了适当的权限:

<uses-permission android:name="android.permission.INTERNET" />

在其他 Android 版本上成功测试

我已经测试并 运行 这个例子并且它 运行 在 :

上成功

连接测试

我可以在设备 运行ning Android Q.

上通过浏览器检索数据(使用下面代码中显示的 URL)

Kotlin 代码

我记录了一路上的各种事情,这样我就可以知道它走了多远。

importSiteKeysButton!!.setOnClickListener {
    Log.d("MainActivity", "import button clicked!")

    val queue = Volley.newRequestQueue(it.context)
    val url = "http://raddev.us/allsitekeys.json"

        // Request a string response from the provided URL.
        val stringRequest = StringRequest(
           Request.Method.GET, url,
           Response.Listener<String> { response ->

              Log.d("MainActivity", "URL returned...")
              Log.d("MainActivity","Response is: ${response}")
        },
        Response.ErrorListener { 
            Log.d("MainActivity", "That didn't work!")})

    // Add the request to the RequestQueue.
    queue.add(stringRequest)
}

在牛轧糖和奥利奥上我看到了预期的成功结果:

12-12 11:42:24.299  3273  3273 D MainActivity: import button clicked!
12-12 11:42:24.776  3273  3273 D MainActivity: URL returned...
12-12 11:42:24.776  3273  3273 D MainActivity: Response is: [{"HasSpecialChars":false,"HasUpperCase":false,"Key":"c3VwZXJzaXRl","MaxLength":0},{"HasSpecialChars":false,"HasUpperCase":false,"Key":"dGhyZWU=","MaxLength":0},{"HasSpecialChars":false,"HasUpperCase":false,"Key":"c2Vjb25kU2l0ZQ==","MaxLength":0},{"HasSpecialChars":false,"HasUpperCase":false,"Key":"eWV0QW5vdGhlcg==","MaxLength":0},{"MaxLength":0,"HasSpecialChars":false,"HasUpperCase":false,"Key":"IUAjJCVeJiooKXt9"}]

然而,在 Android Q 我每次都得到错误响应:

12-12 11:44:32.299  3273  3273 D MainActivity: import button clicked!
12-12 11:44:33.226  3273  3273 D MainActivity: That didn't work!

我是否缺少某些特殊许可或其他什么?

<application
    android:usesCleartextTraffic="true"
...>

您可以尝试在清单中添加 usesClearTextTraffic=true 吗?

这可能是因为,由于 Android Pie,我们建议使用安全网络流量,因此 usesClearTextTraffic 的默认值为 false,因为 Android Pie

您可以阅读 this 文章以了解更多信息