Android API29修改FirebaseReference URL报错:Client is offline
可能的原因及解决方案:
检查Firebase SDK版本兼容性
API29(Android 10)对部分高版本Firebase SDK的支持可能存在兼容问题,建议使用适配API29的稳定版Realtime Database SDK。比如在build.gradle(Module level)中指定兼容版本:implementation 'com.google.firebase:firebase-database:20.3.0'注意:版本号可根据实际兼容情况调整,优先选择官方标注支持API29的稳定版本。
处理API29的明文流量限制
Android 10默认禁止明文HTTP流量,若你的Firebase数据库URL使用HTTP协议(非HTTPS),需在AndroidManifest.xml的<application>标签中添加:android:usesCleartextTraffic="true"若使用HTTPS仍有问题,可创建
res/xml/network_security_config.xml配置文件,允许Firebase域名的网络请求:<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">your-firebase-database-domain.firebaseio.com</domain> </domain-config> </network-security-config>并在
AndroidManifest.xml的<application>标签中引用该配置:android:networkSecurityConfig="@xml/network_security_config"关闭离线持久化(临时排查)
低版本系统中,Firebase的离线持久化可能导致连接判定异常,可在初始化数据库后关闭持久化:val database = FirebaseDatabase.getInstance("your-db-url").reference database.database.setPersistenceEnabled(false) // 关闭离线持久化测试后若问题解决,再根据业务需求决定是否重新开启持久化。
检查API29模拟器网络状态
确认API29模拟器的网络连接正常:- 重启模拟器的网络服务(可通过模拟器右上角的网络图标切换状态)
- 尝试切换模拟器的网络类型(如从Wi-Fi切换到LTE模拟)
- 验证模拟器能否正常访问外部网络(比如打开浏览器测试网页)
验证Firebase配置文件
检查google-services.json文件是否正确配置:- 确认文件中的
database_url与代码中使用的URL完全一致 - 确认Firebase控制台已正确添加当前应用的包名和签名信息(API29环境无需单独添加应用,但需确保基础配置无误)
- 确认文件中的
补充说明
你的代码语法本身没有问题(API33环境可正常运行即可验证),问题大概率出在API29的系统限制、SDK兼容或模拟器网络配置上,按上述步骤逐一排查即可。
内容的提问来源于stack exchange,提问作者NM12619279

