シンプルなAndroidアプリ。Firebaseデータベースへの書き込みに問題があります。データベースルールをパブリックに設定しました。
{
"rules": {
".read": true,
".write": true
}
}
単純なクラスMessage
を作成しました:
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
public class Message {
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference dbRef = database.getReference();
public String sender;
public String message;
public Message(){}
public Message(String sender, String message) {
this.sender = sender;
this.message = message;
}
}
そして、onClickメソッドwriteNewMessage
を実行するボタンを設定します。これらは重要なコード行です。
int counter = 0;
public void writeNewMessage(View view) {
counter += 1;
Message messageToWrite = new Message("John", "Simple message: " + counter);
String messageId = String.valueOf(counter);
dbRef.child("users").child(messageId).setValue(messageToWrite);
}
実行すると、次のエラーが表示されます。
W/RepoOperation: setValue at /users/1 failed: DatabaseError: Permission denied
この質問は単純で、繰り返される可能性が高いことはわかっていますが、認証やその他のコンポーネントにエラーを関与させることなく、この問題を尋ねる質問をまだ見つけていません。問題の単純さは、私を最も混乱させるものです。
編集:私もこのエラーを見つけました:
Failed to load module descriptor class: Didn't find class "com.google.Android.gms.dynamite.descriptors.com.google.firebase.auth.ModuleDescriptor"
これはgoogle-services.jsonの問題のように見えます。
アプリ名とクライアントIDがfirebaseコンソールと同じであることを確認してください。
不明な場合は、プロジェクトのコンソールからgoogle-services.jsonを再ダウンロードして、プロジェクトに追加してください。
完全なソリューション1)。最初に[認証]タブに移動し、[SIGN-IN-METHOD Anonymous On 2)を選択します。次に、[データベース]タブに移動し、ルール{ "rules": { ".read": true, ".write": true }}
3)。 3番目に[ストレージ]タブに移動し、次のルールを記述します
service firebase.storage {
match /b/myapplicationname-f2266.appspot.com/o {
match /{allPaths=**} {
allow read, write;
}}}
注このソリューションは、データベースの読み取りおよび書き込みのパブリックアクセス許可を付与する次の手順を使用して、テスト目的でのみ使用します。
私は問題が何であるか完全にはわかりませんが、Firebaseからプロジェクトを削除して再作成し、新しいgoogle-services.jsonを削除してインストールすると、2回目には完全に機能しました。
幸い、これはテストアプリであり、データベースは空でしたが、このような状況でアカウントに貴重な情報が保存されている場合は、このソリューションを試す前にエクスポートすることをお勧めします。