You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Firebase实时数据库获取链接异常导致Picasso无法加载图片

Firebase实时数据库获取图片链接格式异常导致Picasso无法加载

从Firebase实时数据库获取图片链接时,链接被自动添加开头{abs=和结尾},导致Picasso无法加载图片,但直接使用正确的纯链接时Picasso可正常加载。

Java代码

public class MainActivity extends AppCompatActivity {
private Button button;
private TextView tv0, tv1;
private String string;
private ImageView imageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv0 = findViewById(R.id.textView);
    imageView = findViewById(R.id.imageView);
    tv1 = findViewById(R.id.textView2);
    button = findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("muscles");
            reference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                        string = snapshot.getValue().toString();
                    }
                    tv1.setText(string);
                    tv0.setText("{abs=https://firebasestorage.googleapis.com/v0/b/my-application-5272b.appspot.com/o/ts-space-sun-and-solar-viewing-facts-versus-fiction.webp?alt=media&token=264af080-27a5-4177-ade3-6eaf30125383}");
                    Picasso.get().load("https://firebasestorage.googleapis.com/v0/b/my-application-5272b.appspot.com/o/ts-space-sun-and-solar-viewing-facts-versus-fiction.webp?alt=media&token=264af080-27a5-4177-ade3-6eaf30125383").into(imageView);
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {
                }
            });

        }
    });
}

XML布局代码

<android.widget.Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/button"
    android:text="Button"
    android:textColor="@color/white"
    app:layout_constraintBottom_toTopOf="@+id/textView2"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textView" />

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="tt"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />

<ImageView
    android:id="@+id/imageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintBottom_toTopOf="@+id/button"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.498"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.593"
    tools:srcCompat="@tools:sample/avatars" />
</androidx.constraintlayout.widget.ConstraintLayout>

问题解决方法

原因分析

你当前代码中string = snapshot.getValue().toString();是将整个snapshot对应的对象直接转为字符串,而muscles节点是包含abs键值对的对象,所以转成字符串后会带上{abs=...}的包裹格式。同时循环中错误地使用了外层的snapshot而非循环变量dataSnapshot,导致遍历逻辑无效。

修正方案

方案1:直接提取指定字段值

如果确定只需要abs字段的链接,直接通过child方法获取:

@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
    // 直接获取abs字段对应的字符串值
    string = snapshot.child("abs").getValue(String.class);
    tv1.setText(string);
    // 用提取到的纯链接加载图片
    Picasso.get().load(string).into(imageView);
}

方案2:遍历子节点获取对应值

如果需要遍历muscles下的所有子节点,修正循环逻辑:

@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
    for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
        // 获取当前子节点的键和值
        String key = dataSnapshot.getKey();
        if ("abs".equals(key)) {
            string = dataSnapshot.getValue(String.class);
            break;
        }
    }
    tv1.setText(string);
    Picasso.get().load(string).into(imageView);
}

修正后,string将是纯图片链接,Picasso可以正常加载图片。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:27:29