Android项目接入Cloud Firestore遇gRPC通道服务提供者异常求助
我在Android项目中接入Cloud Firestore,按照官方指南操作,使用代码如下:
val firestoreOptions = FirestoreOptions.getDefaultInstance().toBuilder() .setProjectId("my_project_id") .setCredentials(GoogleCredentials.fromStream(inputStream)) .build() val db: Firestore = firestoreOptions.service
调用firestoreOptions.service时触发如下异常:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testing/com.example.testing.ui.activity.MainActivity}: com.google.cloud.firestore.FirestoreException: io.grpc.ManagedChannelProvider$ProviderNotFoundException: 未找到可用的通道服务提供者。请尝试添加grpc-okhttp、grpc-netty或grpc-netty-shaded依赖 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3645) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7872) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) Caused by: com.google.cloud.firestore.FirestoreException: io.grpc.ManagedChannelProvider$ProviderNotFoundException: 未找到可用的通道服务提供者。请尝试添加grpc-okhttp、grpc-netty或grpc-netty-shaded依赖 at com.google.cloud.firestore.FirestoreOptions$DefaultFirestoreRpcFactory.create(FirestoreOptions.java:90) at com.google.cloud.firestore.FirestoreOptions$DefaultFirestoreRpcFactory.create(FirestoreOptions.java:80) at com.google.cloud.ServiceOptions.getRpc(ServiceOptions.java:564) at com.google.cloud.firestore.FirestoreOptions.getFirestoreRpc(FirestoreOptions.java:358) at com.google.cloud.firestore.FirestoreImpl.<init>(FirestoreImpl.java:79) at com.google.cloud.firestore.FirestoreOptions$DefaultFirestoreFactory.create(FirestoreOptions.java:71) at com.google.cloud.firestore.FirestoreOptions$DefaultFirestoreFactory.create(FirestoreOptions.java:64) at com.google.cloud.ServiceOptions.getService(ServiceOptions.java:544) at com.example.testing.ui.activity.MainActivity.onCreate(MainActivity.kt:85) at android.app.Activity.performCreate(Activity.java:8305) at android.app.Activity.performCreate(Activity.java:8284) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1417) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3626) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7872) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) Caused by: java.io.IOException: io.grpc.ManagedChannelProvider$ProviderNotFoundException: 未找到可用的通道服务提供者。请尝试添加grpc-okhttp、grpc-netty或grpc-netty-shaded依赖 at com.google.cloud.firestore.spi.v1.GrpcFirestoreRpc.<init>(GrpcFirestoreRpc.java:142) at com.google.cloud.firestore.FirestoreOptions$DefaultFirestoreRpcFactory.create(FirestoreOptions.java:88) at com.google.cloud.firestore.FirestoreOptions$DefaultFirestoreRpcFactory.create(FirestoreOptions.java:80) at com.google.cloud.ServiceOptions.getRpc(ServiceOptions.java:564) at com.google.cloud.firestore.FirestoreOptions.getFirestoreRpc(FirestoreOptions.java:358) at com.google.cloud.firestore.FirestoreImpl.<init>(FirestoreImpl.java:79) at com.google.cloud.firestore.FirestoreOptions$DefaultFirestoreFactory.create(FirestoreOptions.java:71) at com.google.cloud.firestore.FirestoreOptions$DefaultFirestoreFactory.create(FirestoreOptions.java:64) at com.google.cloud.ServiceOptions.getService(ServiceOptions.java:544) at com.example.testing.ui.activity.MainActivity.onCreate(MainActivity.kt:85) at android.app.Activity.performCreate(Activity.java:8305) at android.app.Activity.performCreate(Activity.java:8284) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1417) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3626) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7872) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) Caused by: io.grpc.ManagedChannelProvider$ProviderNotFoundException: 未找到可用的通道服务提供者。请尝试添加grpc-okhttp、grpc-netty或grpc-netty-shaded依赖 at io.grpc.ManagedChannelProvider.provider(ManagedChannelProvider.java:45) at io.grpc.ManagedChannelBuilder.forAddress(ManagedChannelBuilder.java:39) at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createSingleChannel(InstantiatingGrpcChannelProvider.java:351) at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.$r8$lambda$uvhXwQKV1b6n5wSR9q5C4LYdHSs(Unknown Source:0) at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider$$ExternalSyntheticLambda0.createSingleChannel(Unknown Source:2) at com.google.api.gax.grpc.ChannelPool.<init>(ChannelPool.java:107) at com.google.api.gax.grpc.ChannelPool.create(ChannelPool.java:85)
当前使用的Firestore依赖:
implementation ('com.google.cloud:google-cloud-firestore:3.9.3')
已尝试添加以下gRPC依赖,但问题仍未解决:
implementation 'io.grpc:grpc-okhttp:1.30.0' implementation 'io.grpc:grpc-netty:1.30.0' implementation 'io.grpc:grpc-netty-shaded:1.30.0' implementation 'io.grpc:grpc-api:1.44.1'
问题根源
你误用了服务器端Cloud Firestore SDK,这个SDK是为后端Java应用设计的,不适合Android环境。Android项目应该使用Firebase官方提供的客户端Firestore SDK,这才是适配移动设备的正确选择。另外你添加的gRPC版本和服务器SDK依赖的版本不兼容,也是导致通道提供者找不到的原因之一。
正确解决方案
方案1:改用Android客户端Firestore SDK(推荐)
这是Android接入Firestore的标准方式,支持离线缓存、自动认证、体积更小:
移除服务器端依赖:
// 删除这行服务器端SDK依赖 // implementation ('com.google.cloud:google-cloud-firestore:3.9.3')添加客户端依赖:
确保项目根目录的settings.gradle中已配置Google Maven仓库:dependencyResolutionManagement { repositories { google() // 其他仓库... } }然后在模块的
build.gradle中添加客户端SDK:implementation 'com.google.firebase:firebase-firestore-ktx:24.10.0' // 建议使用最新稳定版初始化Firestore:
客户端SDK无需手动配置服务账号,会自动通过Firebase认证连接:import com.google.firebase.firestore.FirebaseFirestore val db = FirebaseFirestore.getInstance()
方案2:强制使用服务器端SDK(仅特殊场景)
如果确实需要在Android中使用服务器端SDK,需解决依赖冲突和兼容性问题:
统一gRPC版本:
查看google-cloud-firestore:3.9.3依赖的gRPC版本(可通过./gradlew dependencies命令查看依赖树),确保添加的gRPC依赖版本完全一致。该版本对应的gRPC版本为1.51.0,所以只添加兼容的grpc-okhttp(Android推荐使用):implementation 'io.grpc:grpc-okhttp:1.51.0' implementation 'io.grpc:grpc-api:1.51.0'注意:不要同时添加
grpc-netty和grpc-okhttp,避免冲突。配置ProGuard规则:
防止gRPC相关类被混淆,在proguard-rules.pro中添加:-keep class io.grpc.** { *; } -keep class com.google.api.gax.** { *; } -keep class com.google.cloud.firestore.** { *; }
内容的提问来源于stack exchange,提问作者sethconarrodev

