英文:
Retriving image from firebase into recycler view in android studio
问题
以下是你提供的代码的翻译:
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 = mView.findViewById(R.id.post_title);
post_title.setText(title);
}
public void setDesc(String desc) {
TextView post_desc;
post_desc = mView.findViewById(R.id.post_desc);
post_desc.setText(desc);
}
public void setImage(String image) {
ImageView post_image;
post_image = 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 = 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 = findViewById(R.id.selectimage);
posttitle = findViewById(R.id.posttitle);
postdesc = findViewById(R.id.postdesc);
submitbtn = 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/*");
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());
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("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);
}
}
英文:
I'm trying to retrive image from firebase Database (the image is in storage ) .
I'm unable to convert it into url to pass it to picasso to load it in a recycler view . It works if uploaded and retrieved from same device but the image isn't shown on other devices . Any help would be of almost use .
I am trying to store and retrieve image by using Firebase. It is okay when storing an image, but I can't show it in an ImageView. It doesn't give an error so I can't understand where is the mistake.
i gave the required permissions.
Thank you in advnace.
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);
}
}
}
image upload activity
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);
}
}
答案1
得分: 1
就我所看,问题出在你代码的这部分:
if(!TextUtils.isEmpty(title_value) && !TextUtils.isEmpty(desc_value) && uri!=null)
{
StorageReference filepath=mStorage.child("blog_image").child(random());
//向存储中添加图片
filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(getApplicationContext(),"已上传",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());
你传递给 filepath.putFile(uri)
的 uri
是指向 Android 设备上本地路径的,你要上传到存储中的。然后你将这个 本地 路径写入了 newPost.child("image").setValue(uri.toString())
中。但由于该路径只在 Android 设备上有效,在另一个设备上是无法工作的。
你需要获取已上传文件的下载 URL,并将其写入数据库。根据上传文件的文档,大致如下:
StorageReference filepath=mStorage.child("blog_image").child(random());
filepath.putFile(uri).continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
@Override
public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
if (!task.isSuccessful()) {
throw task.getException();
}
return filepath.getDownloadUrl();
}
}).addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
DatabaseReference newPost=mDataBase.push();
newPost.child("title").setValue(title_value);
newPost.child("desc").setValue(desc_value);
newPost.child("image").setValue(uri.toString());
}
});
需要注意的差异:
- 写入数据库的代码现在位于
onSuccess
监听器内部,因为这在图片上传到存储后才被调用。 - 我们现在调用了
getDownloadUrl
来确定下载 URL,这是一个指向云存储文件的 URL,任何人都可以使用它来访问文件数据。 - 由于
getDownloadUrl
也是一个异步调用,我们使用了continueWith
调用来链接异步任务。我们也可以将完成监听器嵌套,但这是文档中的做法。
英文:
As far as I can see, the problem is in this part of your code:
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());
The uri
that you're passing to filepath.putFile(uri)
is the path to a local locally on the Android device, that you are uploading to Storage. Then you write that local path to the database in newPost.child("image").setValue(uri.toString())
. But since the path is local to the Android device, it won't work on another device.
You need to instead get the download URL of the uploaded file, and write that to the database. Based on the documentation on uploading a file, that'd be something like:
StorageReference filepath=mStorage.child("blog_image").child(random());
filepath.putFile(uri).continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(getApplicationContext(),"Uploaded",Toast.LENGTH_SHORT).show();
return filepath.getDownloadUrl();
}
}).addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void OnSuccessListener(@NonNull Uri uri) {
DatabaseReference newPost=mDataBase.push();
newPost.child("title").setValue(title_value);
newPost.child("desc").setValue(desc_value);
newPost.child("image").setValue(uri.toString());
}
});
Differences to note:
- The code that writes to the database is inside the
onSuccess
listener, since that gets called once the image has been uploaded to Storage. - We now have a call to
getDownloadUrl
to determine the download URL, which is a URL to the file in Cloud Storage that anyone can use to access its data. - Since
getDownloadUrl
is also an asynchronous call, we have acontinueWith
call to chain the asynchronous tasks. We could also have nested the completion listener, but this is what the documentation did.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论