Probleme avec image et firestore
RésoluBonjour,
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:
- Probleme avec image et firestore
- Image iso - Guide
- Acronis true image - Télécharger - Sauvegarde
- Reduire taille image - Guide
- Légender une image - Guide
- Image gratuite - Guide
1 réponse
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.
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.