Xamarin开发Android聊天App遇Java.Lang.IllegalStateException错误求助
我来帮你分析下这个错误的可能原因,结合你用Visual Studio 2017开发Xamarin Android项目的场景,主要有这几个方向:
可能的错误原因
Firebase初始化不完整或配置文件未正确集成
你调用了FirebaseApp.InitializeApp(this),但如果项目里的google-services.json配置文件没放对位置、生成操作没设置正确,或者缺少必要的Firebase NuGet包,原生Firebase SDK根本没法完成初始化,这时候调用FirebaseDatabase.Instance就会抛出非法状态异常。同时混用了两种不同的Firebase SDK
看你的代码,既用了原生Android的Firebase SDK(FirebaseDatabase.Instance这类API),又用了FirebaseClient(应该是.NET生态的Firebase客户端库)。这两个SDK的初始化逻辑完全独立,原生SDK依赖google-services.json,而FirebaseClient通常靠URL/密钥初始化,混用会导致原生SDK的初始化状态异常。未检查Firebase初始化的结果
FirebaseApp.InitializeApp(this)会返回初始化后的FirebaseApp实例,如果初始化失败会返回null,你直接跳过检查就调用后续API,自然会触发异常。
对应的解决办法
1. 确保Firebase配置文件正确集成
- 从Firebase控制台下载对应Android应用的
google-services.json,放到你的Xamarin Android项目根目录; - 在Visual Studio 2017里右键这个文件,把生成操作设置为
GoogleServicesJson; - 检查NuGet包:确保安装了
Xamarin.Firebase.Database、Xamarin.Firebase.Auth等必要包,并且版本保持一致,避免版本冲突。
2. 统一使用一种Firebase SDK方案
不要同时混用原生SDK和.NET客户端,选一种就行:
方案A:使用原生Android Firebase SDK
移除所有FirebaseClient相关代码,全部用原生API操作:
private DatabaseReference databaseReference; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Main); // 先检查Firebase初始化结果 FirebaseApp app = FirebaseApp.InitializeApp(this); if (app == null) { Toast.MakeText(this, "Firebase初始化失败,请检查配置", ToastLength.Long).Show(); return; } // 初始化原生数据库引用 databaseReference = FirebaseDatabase.Instance.GetReference("chats"); databaseReference.AddValueEventListener(this); fab = FindViewById<FloatingActionButton>(Resource.Id.fab); edtChat = FindViewById<EditText>(Resource.Id.input); lstChat = FindViewById<ListView>(Resource.Id.list_of_messages); fab.Click += delegate { PostMessage(); }; if (FirebaseAuth.Instance.CurrentUser == null) { StartActivityForResult(new Android.Content.Intent(this, typeof(Signin)), MyResultCode); } else { Toast.MakeText(this, "Welcome " + FirebaseAuth.Instance.CurrentUser.Email, ToastLength.Short).Show(); } } // 改用原生API发送消息 private void PostMessage() { if (FirebaseAuth.Instance.CurrentUser == null) return; string messageText = edtChat.Text.Trim(); if (string.IsNullOrEmpty(messageText)) return; MessageContent message = new MessageContent(FirebaseAuth.Instance.CurrentUser.Email, messageText); databaseReference.Push().SetValue(message); edtChat.Text = ""; } // 直接在OnDataChange里更新UI public void OnDataChange(DataSnapshot snapshot) { lstMessage.Clear(); foreach (DataSnapshot childSnapshot in snapshot.Children) { MessageContent message = childSnapshot.GetValue<MessageContent>(); lstMessage.Add(message); } ListViewAdapter adapter = new ListViewAdapter(this, lstMessage); lstChat.Adapter = adapter; }
方案B:使用.NET Firebase客户端库
如果坚持用FirebaseClient,那就要移除所有原生SDK的代码(包括FirebaseApp.InitializeApp、FirebaseDatabase.Instance这些调用),确保FirebaseClient的初始化参数(比如Firebase URL、密钥)正确,所有数据操作都通过这个客户端完成。
3. 检查Firebase控制台的项目配置
确保Firebase控制台里你的Android应用的包名和项目里的包名完全一致,SHA-1指纹也正确配置(如果用到了身份验证功能)。
内容的提问来源于stack exchange,提问作者Alejandro H

