【问题标题】:How to retrieve image from URL from Firebase Realtime Database in Android Studio如何在 Android Studio 中从 Firebase 实时数据库中的 URL 检索图像
【发布时间】:2019-07-30 07:11:44
【问题描述】:

我正在尝试提取名为“imageUrl”的 URL,以便从 Firebase 实时数据库的 URL 中检索图像,如下所示:

这是 Firebase 实时数据库中的数据库结构:

enter image description here

我有这个数据库:

{
  "Image": {
    "01": {
      "id": "1",
      "name": "img1",
      "imageUrl": "https://www.pexels.com/photo/beach-calm-clouds-coast-457881/"
    },
    "02": {
      "id": "2",
      "name": "img2",
      "imageUrl": "https://www.pexels.com/photo/sea-beach-holiday-vacation-42151/"
    }
  }
}

这是 Android Studio 中的一个 Activity:

    public class BigToePose extends AppCompatActivity {

    private Context context;
    private ImageView img;

    private FirebaseDatabase database;
    private DatabaseReference mReference;
    private DatabaseReference childReference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.bigtoepose);

        context = this;
        img = findViewById(R.id.imageView);

        database = FirebaseDatabase.getInstance();
        mReference = database.getReference();
        childReference = mReference.child("Image").child("01");
    }

    @Override
    protected void onStart() {
        super.onStart();
        childReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String url = dataSnapshot.child("imageUrl").getValue(String.class);
                Picasso.with(context)
                        .load(url)
                        .into(img);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
}

我尝试将此代码作为要从 Android Studio 中的另一个 Activity 移动到的 Activity 执行,但看起来该 Activity 没有显示。我怎样才能让它工作?

【问题讨论】:

  • 请添加更详细的数据库结构截图。
  • 正如@AlexMamo 所说,我们确实需要了解有关您的 Firebase 结构的更多详细信息,因此请在问题中包含这些信息。但是,请不要将 Firebase 数据库结构作为链接或图像包含在内。将代码和结构包含为文本,这样如果我们想在答案中使用它,我们就不必重新输入它。要获取您的 Firebase 结构,请使用 Firebase 控制台->导出 JSON,然后复制并粘贴您的结构的 sn-p。见images and links are evil
  • 哦 - 看来您可能正在使用数组来存储数据。通常有更好的存储选项 - 请参阅遗留但仍然相关的博客文章 Arrays Are Evil 了解其他一些想法。
  • 我将json格式结构添加为文本。

标签: android firebase firebase-realtime-database imageurl


【解决方案1】:

由于您试图在执行的方法之外获取 firebase 引用,因此它可能根本不会被执行。 尝试通过更改代码如下:-

public class BigToePose extends AppCompatActivity {

private Context context;
private TextView url;
private ImageView img;

private FirebaseDatabase database ;
private DatabaseReference mReference ;
private DatabaseReference childReference ;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.bigtoepose);

    context = this;
    img = findViewById(R.id.imageView);

   // place here
   database = FirebaseDatabase.getInstance();
   mReference = database.getReference("Image");
   childReference = mReference.child("01");
 }

@Override
protected void onStart() {
    super.onStart();
    childReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String message = dataSnapshot.child("imageUrl").getValue(String.class);
            Picasso.with(context)
                    .load(message)
                    .into(img);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
      });
  }
}

【讨论】:

    【解决方案2】:

    我有类似的问题,我正在分享我的例子。看看它是如何为我工作的。

    {"Questions": {
    "1": {
      "question": "One MB is equal to",
      "option1": "1024KB",
      "option2": "1024Byte",
      "option3": "1000KB",
      "option4": "1024GB",
      "answer": "1024KB",
      "hint": "https://www.pexels.com/photo/123-let-s-go-imaginary-text-704767/"
    },
    "2": {
      "question": "What s used to make computer chips",
      "option1": "copper",
      "option2": "steel",
      "option3": "silicon",
      "option4": "iron",
      "answer": "silicon",
      "hint": "https://www.pexels.com/photo/grayscale-photography-of-railroad-crossing-signage-981294/"
    }}}
    

    看看这是我在 Android Studio 中的代码。但是我的图像存储在 firebase 存储中,而您的图像存储在像素上。那是有区别的。

    public class Hint extends MainActivity {
    
    private TextView url;
    private ImageView img;
    DatabaseReference childReference;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hint);
    
        url = findViewById(R.id.mURLText);
        img = findViewById(R.id.mHintImage);
    
        childReference = FirebaseDatabase.getInstance().getReference().child("Questions").child("1").child("Hint");
    }
    
    @Override
    protected void onStart() {
        super.onStart();
        childReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                String message = snapshot.getValue(String.class);
                url.setText(message);
                Picasso.get()
                        .load(message)
                        .into(img);
            }
    
            @Override
            public void onCancelled(@NonNull DatabaseError error) {
    
            }
        });
    }}
    

    所以在你的情况下你的代码应该是这样的:

    public class BigToePose extends AppCompatActivity {
    
    private Context context;
    private ImageView img;
    
    private FirebaseDatabase database;
    private DatabaseReference mReference;
    private DatabaseReference childReference;
    private Int url; // for a new TextView you'll have to create which I've mentioned below
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.bigtoepose);
    
        context = this;
        url = findViewById(R.Id.mURLText); // you will have to add a textView in your XML file and initiate it here, like I did here
        img = findViewById(R.id.imageView);
    
        database = FirebaseDatabase.getInstance();
        mReference = database.getReference();
        childReference = mReference.child("Image").child("01").child(imageUrl);
    }
    
    @Override
    protected void onStart() {
        super.onStart();
        childReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String message = dataSnapshot.getValue(String.class);
                url.setText(message);
                Picasso.get()
                        .load(message)
                        .into(img);
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
        });
      }
    }
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 2019-08-29
      相关资源
      最近更新 更多