Wear OS应用在模拟器外无法发起Volley请求问题咨询
- 检查明文HTTP访问限制
Android 9(API 28)及以上系统默认禁止应用访问HTTP协议的接口,你的本地Web-Api如果是HTTP而非HTTPS协议就会被系统拦截,模拟器可能因为版本较低或者默认开启了明文权限所以运行正常。需要在AndroidManifest.xml的application标签中添加如下配置:
<application ... android:usesCleartextTraffic="true"> ... </application>
如果需要更精细的控制,也可以单独配置网络安全规则放开对应本地域名/IP的明文访问限制。
修正接口访问地址
你提到使用本地Web-Api,若你之前在模拟器中使用127.0.0.1/localhost/模拟器专属的10.0.2.2作为服务端地址,在实体手表上都会失效。需要保证手表和运行Web-Api的电脑连接同一局域网,将mainURL替换为电脑的局域网IP地址(比如http://192.168.3.12:8080),同时确认电脑防火墙没有拦截对应端口的访问请求。检查应用实际权限授予情况
虽然你已经在清单中声明了网络权限,部分Wear OS定制系统会默认禁用第三方应用的网络权限,你可以进入手表的「设置 - 应用和通知 - 应用信息 - 找到你的应用 - 权限」,确认网络权限已经被授予。添加请求重试策略
Wear OS的网络稳定性通常比手机差,Volley默认的超时时间可能过短导致请求还没发出就被终止。你可以在将请求加入队列前,给请求添加重试配置:
stringRequest.setRetryPolicy(new DefaultRetryPolicy( 10000, // 超时时间设为10秒 DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT )); requestQueue.add(stringRequest);
解除电池优化联网限制
Wear OS为了省电默认会限制后台应用的联网行为,如果你的请求是在应用退到后台时发送的,需要将应用加入电池优化白名单:进入手表「设置 - 电池 - 电池优化 - 找到你的应用 - 选择「不优化」」。确认请求队列初始化正确性
你提到请求队列在构造函数中创建,需要确保请求队列是使用Application上下文初始化的,避免随Activity销毁被回收,导致请求没有被实际执行。标准的Volley全局请求队列初始化示例如下:
// 在Application类中初始化 public class MyApplication extends Application { private static RequestQueue requestQueue; @Override public void onCreate() { super.onCreate(); requestQueue = Volley.newRequestQueue(getApplicationContext()); } public static RequestQueue getRequestQueue() { return requestQueue; } }
内容的提问来源于stack exchange,提问作者Florian Auschra

