У меня есть проект Android Kotlin, в котором я пытаюсь получить список всех документов из коллекции (в корне), называемой «средами» в firebase firestore.Это все ново для меня, но я не могу заставить его работать.Исследования онлайн не дали мне правильных ответов о моей ситуации.
Структура хранилища:
ROOT
- environments (is a collection)
- fMzUHbiK7QMsyEdnLmmfksu0j5L2 (is a document)
- name: "number1" (is a field)
- rgeEwg7RhWgWaqlmhwg46dWSfowl (another document, etc.)
- name: "number2"
- users
- etc.
Правила безопасности:
(яконечно, 2-й части (небезопасной) будет достаточно, но я просто попытался явно)
service cloud.firestore {
match /databases/{database}/documents {
match /environments/{document=**} {
allow read, write: if true;
}
match /{document=**} {
allow read, write: if true;
}
}
}
Я использовал помощник Firebase, чтобы связать мое приложение с firebase.Также попробовал ручной метод.Итак, у меня есть это:
уровень корня build.gradle
buildscript {
// ...
dependencies {
// ...
classpath 'com.google.gms:google-services:4.2.0' // google-services plugin
}
}
allprojects {
// ...
repositories {
google() // Google's Maven repository
// ...
}
}
app/build.gradle
apply plugin: 'com.android.application'
android {
// ...
}
dependencies{
// ..
implementation 'com.google.firebase:firebase-core:16.0.7'
implementation 'com.google.firebase:firebase-firestore:18.0.1'
}
apply plugin: 'com.google.gms.google-services'
У меня есть файл google-services.json
в том жекаталог как корневой уровень build.gradle
, как упомянуто в документации.
Я создал проект Kotlin с 1 кнопкой (просто для контроля, когда функции запускаются, запуск этой функции будет автоматизирован позже). Обратите внимание, что я не аутентифицирую пользователей, я пытаюсь создать для всех счастливые потоки, аутентификация и безопасность появятся позже.
Kotlin
Теперь следующий кодв основном из официальной документации
lateinit var db: FirebaseFirestore
override fun onCreate(savedInstanceState: Bundle?) {
// ...
db = FirebaseFirestore.getInstance()
button.setOnClickListener {
db.collection("environments")
.get()
.addOnSuccessListener { result ->
for (document in result) {
Log.d("success", document.id + " => " + document.data)
}
}
.addOnFailureListener { exception ->
Log.d("fail", "Error getting documents: ", exception)
}
}
}
}
Debug / log
I/Firestore: (0.6.6-dev) [FirestoreClient]: Initializing. user=null
I/Firestore: (0.6.6-dev) [Persistence]: Starting transaction: Start MutationQueue
I/Firestore: (0.6.6-dev) [Persistence]: Starting transaction: Allocate query
W/eldingenish_cw: Accessing hidden field Ljava/nio/Buffer;->address:J (light greylist, reflection)
I/Firestore: (0.6.6-dev) [WatchStream]: (e57e2f1) Stream sending: # com.google.firestore.v1.ListenRequest@d97c49a6
add_target {
query {
parent: "projects/[projectname-hidden]/databases/(default)/documents"
structured_query {
from {
collection_id: "environments"
}
order_by {
direction: ASCENDING
direction_value: 1
field {
field_path: "__name__"
}
}
}
}
target_id: 2
}
database: "projects/[projectname-hidden]/databases/(default)"
I/Firestore: (0.6.6-dev) [FirestoreCallCredentials]: Successfully fetched token.
I/Firestore: (0.6.6-dev) [WatchStream]: (e57e2f1) Stream is ready
I/Firestore: (0.6.6-dev) [WatchStream]: (e57e2f1) Stream received headers: {date=Wed, 27 Feb 2019 12:34:34 GMT}
I/Firestore: (0.6.6-dev) [WatchStream]: (e57e2f1) Stream received: # com.google.firestore.v1.ListenResponse@72b77077
target_change {
target_change_type: ADD
target_change_type_value: 1
target_ids: 2
}
I/Firestore: (0.6.6-dev) [WatchStream]: (e57e2f1) Stream received: # com.google.firestore.v1.ListenResponse@d3efdcbe
target_change {
cause {
code: 7
message: "Missing or insufficient permissions."
}
target_change_type: REMOVE
target_change_type_value: 2
target_ids: 2
}
I/Firestore: (0.6.6-dev) [Persistence]: Starting transaction: Release query
W/Firestore: (0.6.6-dev) [Firestore]: Listen for Query(environments) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
D/fail: Error getting documents:
com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Missing or insufficient permissions.
Caused by: io.grpc.StatusException: PERMISSION_DENIED: Missing or insufficient permissions.
Эксперимент
Я начал верить, что мой код неисправен, поэтому я экспериментировал с некоторыми ..
Альтернатива
.addSnapshotListener { querySnapshot, firebaseFirestoreException ->
if(firebaseFirestoreException != null) {
Log.d("main", "Error ggetting documents")
return@addSnapshotListener
}
querySnapshot?.documents?.forEach {document ->
Log.d("main", document.id + " => " + document.data)
}
}
Добавление документа
val item = HashMap<String, Any>()
item["name"] = "test"
db.collection("environments")
.add(item)
.addOnSuccessListener { documentReference ->
Log.d("main", "DocumentSnapshot written with ID: " +
documentReference.id)
}
.addOnFailureListener { e ->
Log.w("main", "Error adding document", e)
}
Ничто, похоже, не имеет разрешения, хотя мои правила безопасности хорошиимо?(Я не могу проверить get collection в симуляторе, он работает только с путями документов). Я вижу, что приложение связано с проектом в консоли.Также учитывается использование операций чтения из хранилища.
Кто-нибудь может мне помочь?
Обратите внимание, что я за брандмауэром Zscaler.Я импортировал сертификат в Android Studio.У моего эмулятора есть доступ в Интернет, но все сертификаты SSL считаются недействительными.Я также пытался запустить приложение на своем реальном телефоне с подключением к Интернету 4G (без Zscaler).