You need to enable JavaScript to run this app. Java安卓开发Firebase数据库无法保存音频元数据问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Java安卓开发Firebase数据库无法保存音频元数据问题求助

问题描述

我正在从Firebase Storage下载音频的名称与URL,下载环节执行正常,但对应数据无法上传至Firebase Database。

数据下载上传逻辑

StorageReference reference = storage.getReference().child("Ringtone");
reference.listAll().addOnSuccessListener(listResult -> {
    Log.d("Tag","reference listed");
    for(StorageReference item:listResult.getItems()){
        Task<Uri> downloadUrlTask = item.getDownloadUrl();
        Task<StorageMetadata> downloadNameTask = item.getMetadata();
        Tasks.whenAll(downloadNameTask,downloadUrlTask).addOnSuccessListener(unused -> {
            Methods methods = new Methods();
            methods.firebse_ring_upload(downloadNameTask.getResult().getName(),downloadUrlTask.getResult());
        });
    }
});

Method类代码

package com.example.alarm.Methods;
import android.net.Uri;
import android.util.Log;
import com.example.alarm.Models.RingtoneModel;
import com.google.firebase.database.FirebaseDatabase;
public class Methods {
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    public void firebse_ring_upload(String songName, Uri uri){
        RingtoneModel ringtoneModel = new RingtoneModel(songName,uri.toString());
        database.getReference().child("Ringtones_Room").child(songName.replace(" ","").replaceAll("[\\W+]","")).setValue(ringtoneModel);
    }
}

RingtoneModel(POJO类)代码

package com.example.alarm.Models;
import android.net.Uri;
public class RingtoneModel {
    String SongName;
    String uri;
    public RingtoneModel(String songName, String uri) {
        SongName = songName;
        this.uri = uri;
    }
    public RingtoneModel(){}
    public String getSongName() {
        return SongName;
    }
    public void setSongName(String songName) {
        SongName = songName;
    }
    public String getUri() {
        return uri;
    }
    public void setUri(Uri uri) {
        this.uri = uri.toString();
    }
}

此前代码因尝试直接存储URI对象抛出StackOverflow错误,修改为将URI转成字符串存储后不再抛出任何错误,但数据仍然没有写入数据库。


更新补充

我按如下方式修改了Method类中的方法:(method类内)

public void firebse_ring_upload(String songName, Uri uri){
    RingtoneModel ringtoneModel = new RingtoneModel(songName,uri.toString());
    database.getReference("https://alarm-sachinbudak-default-rtdb.asia-southeast1.firebasedatabase.app/").child("Ringtones_Room").child(songName.replaceAll("[\\W+]","")).setValue(ringtoneModel);
}

修改后抛出新的报错:

com.google.firebase.database.DatabaseException: Invalid Firebase Database path: https://alarm-sachinbudak-default-rtdb.asia-southeast1.firebasedatabase.app/. Firebase Database paths must not contain '.', '#', '$', '[', or ']'
            at com.google.firebase.database.core.utilities.Validation.validatePathString(Validation.java:45)
            at com.google.firebase.database.core.utilities.Validation.validateRootPathString(Validation.java:58)
            at com.google.firebase.database.FirebaseDatabase.getReference(FirebaseDatabase.java:181)
            at com.example.alarm.Methods.Methods.firebse_ring_upload(Methods.java:14)
            at com.example.alarm.MainActivity.lambda$onCreate$3(MainActivity.java:85)

我的Firebase数据库截图


解决方案

1. 路径错误修复

getReference()方法仅接收数据库内部的相对路径,不支持传入完整数据库URL,你使用的是非美区节点,需要在初始化FirebaseDatabase实例时传入完整URL:
修改Method类中的数据库初始化代码:

FirebaseDatabase database = FirebaseDatabase.getInstance("https://alarm-sachinbudak-default-rtdb.asia-southeast1.firebasedatabase.app/");

后续调用getReference()时直接传入相对路径Ringtones_Room即可。

2. 无报错也无法写入数据的排查

  • 检查数据库权限规则,调试阶段可以先开放测试权限验证写入功能:
{
  "rules": {
    ".read": true,
    ".write": true
  }
}
  • 给setValue操作添加回调打印错误信息,方便定位具体问题:
database.getReference().child("Ringtones_Room").child(songName.replace(" ","").replaceAll("[\\W+]",""))
.setValue(ringtoneModel)
.addOnSuccessListener(aVoid -> Log.d("DB_WRITE", "写入成功"))
.addOnFailureListener(e -> Log.e("DB_WRITE", "写入失败", e));
  • 补充POJO类的setter方法避免序列化异常,新增String参数的setUri方法:
public void setUri(String uri) {
    this.uri = uri;
}

内容的提问来源于stack exchange,提问作者Sachin Burdak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 04:06:08