Я пытаюсь обновить свою базу данных в firestore на устройстве android, но получаю сообщение об ошибке «Отсутствует или недостаточно разрешений». Если это из-за правил, то же правило работает нормально для обновления в iOS, но не в android. Может кто-нибудь указать мне на правильное правило. Ниже приведено правило, которое я использую
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// This rule allows anyone on the internet to view, edit, and delete
// all data in your Firestore database. It is useful for getting
// started, but it is configured to expire after 30 days because it
// leaves your app open to attackers. At that time, all client
// requests to your Firestore database will be denied.
//
// Make sure to write security rules for your app before that time, or else
// your app will lose access to your Firestore database
match /users/{userId} {
allow read, update, delete: if request.auth != null;
allow create: if request.auth != null;
}
}
}
Код, который я использую для обновления записи
db.collection("user").document(documentSnaapShotId).update(userData).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
sendUserToInitialPage();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
String error = e.getMessage();
Toast.makeText(UpdateUserActivity.this, "Error:" + error, Toast.LENGTH_LONG).show();
}
});
Это изображение - это код, который я использовал для аутентификации Пользователь и код, указанный c, открывается, только если пользователь прошел проверку подлинности по телефону. Теперь во время отладки я обнаружил еще одну проблему, когда при нажатии на выход (FirebaseAuth.getInstance (). Signout) он возвращается на эту страницу и выдает ту же ошибку, и приложение само убивает себя. Я предполагаю, что есть какая-то проблема с тем, как я аутентифицирую пользователя. Любая помощь, пожалуйста. Ниже приведен весь код, который я использовал для аутентификации пользователя
private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
mFirestore = FirebaseFirestore.getInstance();
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
mFirestore.collection("mydbexample").whereEqualTo("uid", uid).addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
if(e != null) {
Toast.makeText(PhoneAuthActivity.this, "Error:" + e, Toast.LENGTH_LONG).show();
}
for(DocumentSnapshot doc : queryDocumentSnapshots) {
docId = doc.getId();
userFname = doc.getString("firstname");
userLname = doc.getString("lastname");
userCountry = doc.getString("country");
userState = doc.getString("state");
userCity = doc.getString("city");
userArea = doc.getString("area");
documentExists = (userFname!= null);
}
if(documentExists){
sendUserToInitialPage();
}
else {
sendUserToHome();
}
}
});
} else {
if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
Toast.makeText(getApplicationContext(),
"Incorrect Verification Code ", Toast.LENGTH_LONG).show();
}
}
}
});
}
private void sendUserToHome() {
Intent homeIntent = new Intent(PhoneAuthActivity.this, GuestUserActivity.class);
homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(homeIntent);
finish();
}
private void sendUserToInitialPage() {
Intent homeIntent = new Intent(PhoneAuthActivity.this, InitialPageActivity.class);
homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(homeIntent);
finish();
}
Стек вызовов
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app.virtualbloodbank, PID: 489
java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.Iterator com.google.firebase.firestore.QuerySnapshot.iterator()' on a null object reference
at com.app.virtualbloodbank.PhoneAuthActivity$4$1.onEvent(PhoneAuthActivity.java:224)
at com.app.virtualbloodbank.PhoneAuthActivity$4$1.onEvent(PhoneAuthActivity.java:217)
at com.google.firebase.firestore.Query.lambda$addSnapshotListenerInternal$2(com.google.firebase:firebase-firestore@@21.4.0:1039)
at com.google.firebase.firestore.Query$$Lambda$3.onEvent(Unknown Source:6)
at com.google.firebase.firestore.core.AsyncEventListener.lambda$onEvent$0(com.google.firebase:firebase-firestore@@21.4.0:42)
at com.google.firebase.firestore.core.AsyncEventListener$$Lambda$1.run(Unknown Source:6)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)