我正试图从我的android项目访问云Firestore。我只是按照谷歌提供的指南做的。https://cloud.google.com/firestore/docs/create-database-server-client-library
val firestoreOptions = FirestoreOptions.getDefaultInstance().toBuilder()
.setProjectId("my_project_id")
.setCredentials(GoogleCredentials.fromStream(inputStream))
.build()
val db: Firestore = firestoreOptions.service
当firestoreOptions。服务被使用,我得到这个错误
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: No functional channel service provider found. Try adding a dependency on the grpc-okhttp, grpc-netty, or grpc-netty-shaded artifact
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: No functional channel service provider found. Try adding a dependency on the grpc-okhttp, grpc-netty, or grpc-netty-shaded artifact
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: No functional channel service provider found. Try adding a dependency on the grpc-okhttp, grpc-netty, or grpc-netty-shaded artifact
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: No functional channel service provider found. Try adding a dependency on the grpc-okhttp, grpc-netty, or grpc-netty-shaded artifact
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)
这是我在build.gradle中使用的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'
但这似乎不起作用。我对grpc一无所知。
我熟悉Google Cloud,包括Firestore,但我不是Java开发人员,我几乎完全不熟悉Gradle,所以请原谅下面的幼稚代码。以下内容适合我。
我使用--authorize-session
的Cloud Shell,因为它提供:
- 授权w/Google Cloud:
- Java
- Gradle
gcloud cloud-shell ssh --authorize-session
:
Q="75904235"
PROJECT="$(whoami)-$(date +%y%m%d)-${Q}"
REGION="us-west1" # Or your preferred
gcloud projects create ${PROJECT}
gcloud app create
--region=${REGION}
--project=${PROJECT}
gcloud firestore databases create
--region=${REGION}
--project=${PROJECT}
:
mkdir -p ${Q}/src/main/java/stackoverflow
cd ${Q}
gradle
Withbuild.gradle
:
plugins {
id "application"
}
apply plugin : "java"
ext {
javaMainClass = "stackoverflow.FirestoreExample"
}
application {
mainClassName = javaMainClass
}
repositories {
mavenCentral()
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies {
implementation "com.google.cloud:google-cloud-firestore:3.9.3"
implementation "io.grpc:grpc-netty-shaded:1.54.0"
}
:FirestoreExample.java
:
package stackoverflow;
import com.google.api.core.ApiFuture;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.firestore.DocumentReference;
import com.google.cloud.firestore.Firestore;
import com.google.cloud.firestore.FirestoreOptions;
import com.google.cloud.firestore.QueryDocumentSnapshot;
import com.google.cloud.firestore.QuerySnapshot;
import com.google.cloud.firestore.WriteResult;
import com.google.common.collect.ImmutableMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.io.*;
public class FirestoreExample {
public static void main(String[] args) {
// Replace with value of ${PROJECT}
String projectId = "...";
try {
FirestoreOptions firestoreOptions =
FirestoreOptions.getDefaultInstance().toBuilder()
.setProjectId(projectId)
.setCredentials(GoogleCredentials.getApplicationDefault())
.build();
Firestore db = firestoreOptions.getService();
DocumentReference docRef = db.collection("users").document("alovelace");
Map<String, Object> data = new HashMap<>();
data.put("first", "Ada");
data.put("last", "Lovelace");
data.put("born", 1815);
ApiFuture<WriteResult> result = docRef.set(data);
System.out.println("Update time : " + result.get().getUpdateTime());
} catch (Exception e) {
e.printStackTrace();
}
}
}