【发布时间】:2020-07-24 11:22:42
【问题描述】:
我正在尝试从 firebase 数据库中检索图像(图像在存储中)。 我无法将其转换为 url 以将其传递给 picasso 以将其加载到回收站视图中。如果从同一设备上载和检索,但图像未显示在其他设备上,它可以工作。任何帮助几乎都会派上用场。 我正在尝试使用 Firebase 存储和检索图像。存储图像时可以,但我无法在 ImageView 中显示它。它没有给出错误,所以我不明白错误在哪里。 我提供了所需的权限。
谢谢你。 Mainactivity.java
package com.example.blogger;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.squareup.picasso.Picasso;
public class blogupload extends AppCompatActivity {
private RecyclerView mBlogList;
private DatabaseReference mDataBase;
private FirebaseAuth mAuth=FirebaseAuth.getInstance();
FirebaseRecyclerAdapter adapter;
@Override
protected void onStart() {
super.onStart();
FirebaseRecyclerOptions<Blog> options =
new FirebaseRecyclerOptions.Builder<Blog>()
.setQuery(mDataBase,Blog.class)
.build();
adapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(options) {
@Override
public BlogViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.blog_row, parent, false);
return new BlogViewHolder(view);
}
@Override
protected void onBindViewHolder(BlogViewHolder holder, int position, Blog model) {
holder.setTitle(model.getTitle());
holder.setDesc(model.getDesc());
holder.setImage(model.getImage());
}
};
adapter.startListening();
mBlogList.setAdapter(adapter);
}
public static class BlogViewHolder extends RecyclerView.ViewHolder {
View mView;
public BlogViewHolder(@NonNull View itemView) {
super(itemView);
mView=itemView;
}
public void setTitle(String title)
{
TextView post_title ;
post_title=(TextView) mView.findViewById(R.id.post_title);
post_title.setText(title);
}
public void setDesc(String desc)
{
TextView post_desc ;
post_desc=(TextView) mView.findViewById(R.id.post_desc);
post_desc.setText(desc);
}
public void setImage(String image)
{
ImageView post_image;
post_image=(ImageView) mView.findViewById(R.id.post_image);
Picasso.get().load(image).into(post_image);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater=getMenuInflater();
inflater.inflate(R.menu.action_menu,menu);
return true;
}
@Override
protected void onStop() {
super.onStop();
adapter.stopListening();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_blogupload);
mDataBase= FirebaseDatabase.getInstance().getReference().child("blog");
mBlogList=(RecyclerView) findViewById(R.id.blog_list);
mBlogList.setLayoutManager(new LinearLayoutManager(this));
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.add:
Intent intent = new Intent(getApplicationContext(), addpostactivity.class);
startActivity(intent);
return true;
case R.id.logout:
mAuth.signOut();
Intent intent1 =new Intent(getApplicationContext(),MainActivity.class);
startActivity(intent1);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
图片上传活动
package com.example.blogger;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
import com.squareup.picasso.Picasso;
import java.util.Random;
public class addpostactivity extends AppCompatActivity
{
private static final int MAX_LENGTH = 23 ;
ProgressBar mProgress;
ImageView selectimage;
TextView posttitle,postdesc;
Button submitbtn;
private Uri uri;
private static final int GALLERY_INTENT=2;
private StorageReference mStorage;
private DatabaseReference mDataBase;
private FirebaseAuth mAuth;
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==GALLERY_INTENT&&resultCode==RESULT_OK)
{
uri=data.getData();
Picasso.get().load(uri).into(selectimage);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_addpostactivity);
selectimage=(ImageView) findViewById(R.id.selectimage);
posttitle=(TextView) findViewById(R.id.posttitle);
postdesc=(TextView) findViewById(R.id.postdesc);
submitbtn=(Button) findViewById(R.id.submitbtn);
mProgress= new ProgressBar(this);
mDataBase= FirebaseDatabase.getInstance().getReference().child("blog");
submitbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startposting();
}
});
selectimage.setVisibility(View.VISIBLE);
mStorage= FirebaseStorage.getInstance().getReference();
selectimage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent =new Intent(Intent.ACTION_PICK);
intent.setType("image/w");
startActivityForResult(intent,GALLERY_INTENT);
}
});
}
public static String random() {
Random generator = new Random();
StringBuilder randomStringBuilder = new StringBuilder();
int randomLength = generator.nextInt(MAX_LENGTH);
char tempChar;
for (int i = 0; i < randomLength; i++){
tempChar = (char) (generator.nextInt(96) + 32);
randomStringBuilder.append(tempChar);
}
return randomStringBuilder.toString();
}
private void startposting()
{
mProgress.setProgress(0);
mProgress.setVisibility(View.VISIBLE);
String title_value=posttitle.getText().toString().trim();
String desc_value=postdesc.getText().toString().trim();
if(!TextUtils.isEmpty(title_value) && !TextUtils.isEmpty(desc_value) && uri!=null)
{
StorageReference filepath=mStorage.child("blog_image").child(random());
//adding a picture to storage
filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(getApplicationContext(),"Uploaded",Toast.LENGTH_SHORT).show();
}
});
}
DatabaseReference newPost=mDataBase.push();
//newPost.child("uid").setValue(mAuth.getCurrentUser().getUid());
newPost.child("title").setValue(title_value);
newPost.child("desc").setValue(desc_value);
newPost.child("image").setValue(uri.toString());
Intent intent = new Intent(getApplicationContext(), blogupload.class);
startActivity(intent);
}
}
【问题讨论】:
-
你能在浏览器中打开图片网址吗??只需使用 System.out.println(image) 打印 url;如果它没有在浏览器中打开,则意味着您的图片网址有问题。
-
@TusharLathiya No
-
没有 url 怎么加载?你能得到标题和描述吗?
-
@TusharLathiya 是的
-
我认为您需要检查 Firebase 响应并需要检查图片网址。如果可能,分享回复。
标签: java android firebase firebase-realtime-database android-recyclerview