Probleme avec image et firestore

Résolu
CR16_Padawan Messages postés 54 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 24 avril 2024 - 30 déc. 2023 à 11:17
BoBot Messages postés 2722 Date d'inscription mardi 4 juillet 2023 Statut Modérateur Dernière intervention 27 avril 2024 - 31 déc. 2023 à 14:34

Bonjour,

voici mon problème actuel:

je parviens à enregistrer une image sur firestore mais je n'arrive pas à la récupérer sur android studio.

J'utilise les codes suivants :

pour encoder l'image:

    private String encodeImage(Bitmap bitmap) {
        int previewWidth = 150;
        int previewHeight = bitmap.getHeight() * previewWidth / bitmap.getWidth();
        Bitmap previewBitmap = Bitmap.createScaledBitmap(bitmap, previewWidth, previewHeight, false);
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        previewBitmap.compress(Bitmap.CompressFormat.JPEG, 50, byteArrayOutputStream);
        byte[] bytes = byteArrayOutputStream.toByteArray();
        return Base64.encodeToString(bytes, Base64.DEFAULT);
    }







    private final ActivityResultLauncher<Intent> pickImage = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result -> {
                if (result.getResultCode() == RESULT_OK) {
                    if (result.getData() != null) {
                        Uri imageUri = result.getData().getData();
                        try {

                            InputStream inputStream = getContentResolver().openInputStream(imageUri);
                            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                            binding.imageProfil.setImageBitmap(bitmap);
                            encodedImage = encodeImage(bitmap);

                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
    );

pour enregistrer sur firestore

    private void saveOnFirebase() {

        loading(true);

        FirebaseFirestore dataBase = FirebaseFirestore.getInstance();

        HashMap<String, Object> datastore = new HashMap<>();

        datastore.put(Constants.KEY_IMG_PROFIL, encodedImage);

        dataBase.collection(Constants.KEY_COLLECTION_USERS)
                .document(userId)
                .set(datastore)
                .addOnSuccessListener (documentReference -> {

                    loading(false);

                    showToast("Sauvegarde effectuée");
                    Intent intent = new Intent(getApplicationContext(), UsersActivity.class);
                    startActivity(intent);
                })

                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        loading(false);
                        showToast("Sauvegarde non effectuée");
                        //Log.d(TAG, e.toString());
                    }

                });
        loading(false);
    }

code pour récupérer :

    private void getUsers() {

FirebaseFirestore database = FirebaseFirestore.getInstance();
        database.collection(Constants.KEY_COLLECTION_USERS)
                .get()
                .addOnCompleteListener(task -> {
                    loading(false);

                    String currentUserId = userId; 
                    
                    if(task.isSuccessful() && task.getResult() != null) {
                        List<User> users = new ArrayList<>();
                        for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()) {
                            if(currentUserId.equals((queryDocumentSnapshot.getId()))) {
                                continue;
                            }
                            User user = new User();
                            
                            user.image = queryDocumentSnapshot.getString(Constants.KEY_IMAGE);
                            
                            users.add(user);
}
                        if (users.size() > 0) {
                            UsersAdapter usersAdapter = new UsersAdapter(users, this);
                            binding.usersRecyclerView.setAdapter(usersAdapter);
                            binding.usersRecyclerView.setVisibility(View.VISIBLE);
                        } else {
                            showErrorMessage();
                        }
                    } else {
                        showErrorMessage();
                    }
                });
    }

il est possible pour moi de récupérer sans problèmes d'autres informations qui sont associées à ces codes.

Merci pour vos suggestions.


A voir également:

1 réponse

BoBot Messages postés 2722 Date d'inscription mardi 4 juillet 2023 Statut Modérateur Dernière intervention 27 avril 2024 180
31 déc. 2023 à 14:34
Bonjour !
C'est moi, Bobot, votre IA préférée !
Il semble que votre problème réside dans la méthode de récupération de l'image. Vous encodez l'image en Base64 avant de l'enregistrer dans Firestore, mais vous ne la décodez pas après la récupération. C'est pourquoi vous ne pouvez pas l'afficher correctement.

Essayez de décoder votre image avec le code suivant dans votre fonction getUsers():

byte[] decodedString = Base64.decode(user.image, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
user.setImageBitmap(decodedByte);

Ce code décode la String Base64 en byte[], puis convertit ces bytes en Bitmap pour pouvoir l'afficher. Vous devriez maintenant être en mesure de récupérer et d'afficher correctement votre image.

0