android - 如何在我的应用程序上显示来自 Firebase 存储的图像?
问题描述
我不能让应用程序在我的 android 应用程序上显示个人资料图片,我可以成功上传它,但在应用程序中显示它的代码不起作用。问题是我的应用程序无法转换图像中的 firebase 链接,我真的不知道为什么,代码与 youtube 教程中的完全相同。
ProfileActivity.java
package com.example.scrapbase11;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
import com.squareup.picasso.Picasso;
import com.theartofdev.edmodo.cropper.CropImage;
import com.theartofdev.edmodo.cropper.CropImageView;
import de.hdodenhof.circleimageview.CircleImageView;
public class ProfileActivity extends AppCompatActivity {
private CircleImageView Profileimage;
private TextView usernickname, userfirstlastname, usercomment, registrationdate;
private FirebaseAuth mAuth;
private DatabaseReference UsersRef;
private StorageReference UserProfileImageRef;
private ProgressDialog loadingBar;
private String currentuserid;
final static int Gallery_Pick = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
loadingBar = new ProgressDialog(this);
mAuth = FirebaseAuth.getInstance();
currentuserid = mAuth.getCurrentUser().getUid();
UserProfileImageRef = FirebaseStorage.getInstance().getReference().child("Profile Images");
usernickname = (TextView) findViewById(R.id.profile_nickname);
UsersRef = FirebaseDatabase.getInstance().getReference().child("Users").child(currentuserid);
userfirstlastname = (TextView) findViewById(R.id.profile_firstlastname);
usercomment = (TextView) findViewById(R.id.profile_comment);
Profileimage = (CircleImageView) findViewById(R.id.my_profile_pic);
registrationdate= (TextView) findViewById(R.id.terzarow);
UsersRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()){
String myusernickname = snapshot.child("nickname").getValue().toString();
String myusercomment = snapshot.child("status").getValue().toString();
String myfamilyname = snapshot.child("familyname").getValue().toString();
String mygivenname = snapshot.child("givenname").getValue().toString();
String myregistrationdate = snapshot.child("registrationdate").getValue().toString();
usernickname.setText("@" + myusernickname);
usercomment.setText(myusercomment);
userfirstlastname.setText(mygivenname + " " + myfamilyname);
registrationdate.setText(myregistrationdate);
}
else {
Toast.makeText(ProfileActivity.this, "Errore del database", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
Profileimage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent galleryIntent = new Intent();
galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
galleryIntent.setType("image/*");
startActivityForResult(galleryIntent, Gallery_Pick);
}
});
UsersRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot)
{
if(snapshot.exists())
{
if (snapshot.hasChild("profileimage"))
{
String image = snapshot.child("profileimage").getValue().toString();
Picasso.get().load(image).into(Profileimage);
}
else
{
Toast.makeText(ProfileActivity.this, "Please select profile image first.", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==Gallery_Pick && resultCode==RESULT_OK && data!=null)
{
Uri ImageUri = data.getData();
CropImage.activity()
.setGuidelines(CropImageView.Guidelines.ON)
.setAspectRatio(1, 1)
.start(this);
}
if(requestCode==CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE){
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if(resultCode == RESULT_OK){
loadingBar.setTitle("Profile image updating");
loadingBar.setMessage("Please wait...");
loadingBar.show();
loadingBar.setCanceledOnTouchOutside(true);
Uri resultUri = result.getUri();
StorageReference filePath = UserProfileImageRef.child(currentuserid + ".jpg");
filePath.putFile(resultUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
{
if (task.isSuccessful()){
final String downloadUrl = task.getResult().getStorage().getDownloadUrl().toString();
UsersRef.child("profileimage").setValue(currentuserid + ".jpg")
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
Intent setupIntent = new Intent(ProfileActivity.this, ProfileActivity.class);
startActivity(setupIntent);
Toast.makeText(ProfileActivity.this, "Profile Image stored succesfully", Toast.LENGTH_SHORT).show();
loadingBar.dismiss();
}
else {
String message = task.getException().getMessage();
loadingBar.dismiss();
Toast.makeText(ProfileActivity.this, "Error Occured", Toast.LENGTH_SHORT).show();
}
}
});
}
}
}
});
}
else {
Toast.makeText(this, "Error occured: Image can't be cropped. Try again", Toast.LENGTH_SHORT).show();
loadingBar.dismiss();
}
}
}
}
这是代码的主要部分,其中包括显示图像的部分:
if(snapshot.exists())
{
if (snapshot.hasChild("profileimage"))
{
String image = snapshot.child("profileimage").getValue().toString();
Picasso.get().load(image).into(Profileimage);
}
编辑:我也试过把 UsersRef.child("profileimage").setValue(downloadUrl) 但结果是一样的,只是数据库中 profileimage 的代码不同,这就是结果
解决方案
我有一个简单的方法给你,它对我有用:
在您的应用中设置 firebase 和 firebase-storage 后...
第一的 :
xml文件:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
第二 :
主要活动:
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView = (ImageView) findViewById(R.id.imageView);
FirebaseStorage firebaseStorage = FirebaseStorage.getInstance();
StorageReference storageReference = firebaseStorage.getReference();
storageReference.child("images/main.jpg").getBytes(Long.MAX_VALUE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
@Override
public void onSuccess(byte[] bytes) {
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length);
imageView.setImageBitmap(bitmap);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});
}
}
推荐阅读
- python - 在Python中通过if循环比较两列
- dart - Flutter 每次都运行基本的演示应用程序
- c# - JsonIgnore 属性不适用于 ASP.NET MVC 实体的一个属性
- c++ - 标识符“__readgsqword”未定义 - Visual Studio 2017
- html - 在 RAILS_ENV=生产服务器上不正确显示 GUI
- javascript - 为什么将 React 组件存储为变量或状态是不好的设计实践
- python - 10.13 High Sierra OSX - Python mprotect 在授予 exec 权限时总是失败,使用 ENOMEM
- nginx - localhost 发送了无效响应。ERR_INVALID_HTTP_RESPONSE
- python - tesseract中的图像太大错误
- c# - Office 365 App Only Auth MVC c#