Проблема с получением изображения из базы данных firebase в студии Android

Aug 17 2020

Я пытаюсь создать приложение для чата в студии Android с помощью java. Я успешно написал код для загрузки изображения и переноса его из хранилища Firebase в базу данных Firebase. Когда я пытаюсь получить изображение в методе с picasso, представление изображения, в котором я пытаюсь это сделать, становится невидимым.

private Button UpdateAccountSettings;
private EditText userName, userStatus;
private CircleImageView userProfileImage;
private String currentUserID;
private FirebaseAuth mAuth;
private DatabaseReference RootRef;
private StorageReference UserProfileImagesRef;
private static final int GalleryPic = 1;
private ProgressDialog loadingBar;
private String photoUrl;

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

    mAuth = FirebaseAuth.getInstance();
    currentUserID = mAuth.getCurrentUser().getUid();
    RootRef = FirebaseDatabase.getInstance().getReference();
    UserProfileImagesRef = FirebaseStorage.getInstance().getReference().child("Profile Images");

    InitializeFields();

   userProfileImage.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, GalleryPic);
       }
   });



    UpdateAccountSettings.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            UpdateSetting();
        }
    });


    RetrieveUserInfo();

}



private void InitializeFields() {

    UpdateAccountSettings = (Button) findViewById(R.id.update_settings_button);
    userName = (EditText) findViewById(R.id.set_user_name);
    userStatus = (EditText) findViewById(R.id.set_profile_status);
    userProfileImage = (CircleImageView) findViewById(R.id.set_profile_image);
    loadingBar = new ProgressDialog(this);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)
{

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode==GalleryPic && 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.setMessage("Uploading Image");
                    loadingBar.setCanceledOnTouchOutside(false);
                    loadingBar.show();

                     Uri resultUri = result.getUri();


                    StorageReference filepath = UserProfileImagesRef.child(currentUserID + ".jpg");

                   filepath.putFile(resultUri)
                            .addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>()
                            {
                        @Override
                        public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task)
                        {
                            if (task.isSuccessful())
                            {
                                Toast.makeText(SettingsActivity.this, "Profile Image Saved Successfully...", Toast.LENGTH_SHORT).show();
                                loadingBar.dismiss();

                                String downloadUrl = task.getResult().getDownloadUrl().toString();

                                RootRef.child("Users").child(currentUserID).child("image")
                                        .setValue(downloadUrl)
                                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Void> task)
                                            {
                                                if (task.isSuccessful())
                                                {
                                                    loadingBar.dismiss();
                                                }
                                                else
                                                {
                                                    String message = task.getException().toString();
                                                    Toast.makeText(SettingsActivity.this, "Error : " + message, Toast.LENGTH_SHORT).show();
                                                    loadingBar.dismiss();
                                                }
                                            }
                                        });
                            }
                            else
                            {
                                String message = task.getException().toString();
                                Toast.makeText(SettingsActivity.this, "Error : " + message, Toast.LENGTH_SHORT).show();
                                loadingBar.dismiss();
                            }

                        }
                    });
                }
    }

}

private void UpdateSetting() {
    String setUserName = userName.getText().toString();
    String setStatus = userStatus.getText().toString();

    if (TextUtils.isEmpty(setUserName)) {
        AlertDialog.Builder builder = new AlertDialog.Builder(SettingsActivity.this);
        builder.setCancelable(true);
        builder.setTitle("Error");
        builder.setMessage("Please write a user name");
        builder.setNegativeButton("Back", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        builder.show();
    } else if (TextUtils.isEmpty(setStatus)) {
        AlertDialog.Builder builder = new AlertDialog.Builder(SettingsActivity.this);
        builder.setCancelable(true);
        builder.setTitle("Error");
        builder.setMessage("Please write a Status");
        builder.setNegativeButton("Back", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        builder.show();

    } else {
        HashMap<String, String> profileMap = new HashMap<>();
        profileMap.put("uid", currentUserID);
        profileMap.put("name", setUserName);
        profileMap.put("status", setStatus);
        profileMap.put("image", photoUrl);
        RootRef.child("Users").child(currentUserID).setValue(profileMap)
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()) {
                            SendUserToMainActivity();
                            Toast.makeText(SettingsActivity.this, "Profile Updated Successfully", Toast.LENGTH_SHORT).show();

                        }
                        else
                            {

                            String message = task.getException().toString();
                            Toast.makeText(SettingsActivity.this, "Error :" + message, Toast.LENGTH_SHORT).show();

                        }
                    }

                    ;
                });
    }
}



private void RetrieveUserInfo()
{
    RootRef.child("Users").child(currentUserID)
            .addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot)
                {
                    if((dataSnapshot.exists()) && (dataSnapshot.hasChild("name") && (dataSnapshot.hasChild("image"))))
                    {
                        String retrieveUserName = dataSnapshot.child("name").getValue().toString();
                        String retrieveUserStatus = dataSnapshot.child("status").getValue().toString();
                        String retrieveProfileImage = dataSnapshot.child("image").getValue().toString();

                        userName.setText(retrieveUserName);
                        userStatus.setText(retrieveUserStatus);
                        photoUrl = retrieveProfileImage;
                        Picasso.get().load(retrieveProfileImage).into(userProfileImage);


                    }
                    else if ((dataSnapshot.exists()) && (dataSnapshot.hasChild("name")))
                    {
                        String retrieveUserName = dataSnapshot.child("name").getValue().toString();
                        String retrieveUserStatus = dataSnapshot.child("status").getValue().toString();

                        userName.setText(retrieveUserName);
                        userStatus.setText(retrieveUserStatus);
                    }
                    else
                    {
                        Toast.makeText(SettingsActivity.this, "Please Set Your Profile Info...", Toast.LENGTH_SHORT).show();
                    }

                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError)
                {

                }
            });
}



private void SendUserToMainActivity()
{
    Intent mainIntent = new Intent(SettingsActivity.this, MainActivity.class);
    mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(mainIntent);
    finish();
}

}

Ответы

Nik Aug 17 2020 at 22:07

Во-первых, убедитесь, что ваш URL-адрес в базе данных, потому что иногда URL-адрес генерируется по-другому, например, если не сгенерировать URI должным образом, чем URL-адрес будет сгенерирован другим способом

  1. скопируйте путь к изображению из вашей базы данных и проверьте в браузере, действителен ли URL-адрес
  2. используйте glide lib. что более эффективно, чем Пикассо

Glide.with (yourContext) .load (url) .centerCrop (). Placeholder (R.drawable.loading_spinner) .into (yourImageView)

  • обратите внимание: centreCrop () и placeHolder () не являются обязательными, вы можете удалить их, если хотите, для получения дополнительной информации https://github.com/bumptech/glide