Dans mon application, j'ai créé un code indiquant que lorsque je choisis une image dans la galerie ou la caméra, l'image doit être envoyée sur le chat, mais lorsque je le fais, l'application revient sur l'activité de chat sans l'image envoyée. Ci-dessous, le code que j'ai créé:
sendMedia.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//check if storage permission exists
if (!checkStoragePermission()) {
requestStoragePermission();
}else {
pickFromGallery();
}
}
});
takePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//check if camera permission exists
if (!checkCameraPermission()) {
requestCameraPermission();
}else {
pickFromCamera();
}
}
});
private void pickFromGallery() {
//pick from gallery
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, IMAGE_PICK_GALLERY_CODE);
}
private void pickFromCamera() {
//open camera and pick image
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Images.Media.TITLE, "Temp Pick");
contentValues.put(MediaStore.Images.Media.DESCRIPTION, "Temp Descr");
imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, IMAGE_PICK_CAMERA_CODE);
}
private void sendImageMessage(Uri imageUri) throws IOException {
ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Sending Image.");
progressDialog.show();
String timeStamp = ""+System.currentTimeMillis();
String filePath = "ChatImages/"+"post_"+timeStamp;
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
byte[] data = byteArrayOutputStream.toByteArray();
StorageReference reference = FirebaseStorage.getInstance().getReference().child(filePath);
reference.putBytes(data)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
progressDialog.dismiss();
Task<Uri> uriTask = taskSnapshot.getStorage().getDownloadUrl();
while (!uriTask.isSuccessful());
String downloadUri = uriTask.getResult().toString();
if (uriTask.isSuccessful()) {
DatabaseReference reference1 = FirebaseDatabase.getInstance().getReference();
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("sender", firebaseUser.getUid());
hashMap.put("receiver", userId);
hashMap.put("message", downloadUri);
hashMap.put("timestamp", timeStamp);
hashMap.put("type", "image");
hashMap.put("isseen", false);
reference1.child("chats").push().setValue(hashMap);
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("users").child(firebaseUser.getUid());
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
Users users = snapshot.getValue(Users.class);
if (notify) {
}
notify = false;
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(MessageActivity.this, "Failed to send image.", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case CAMERA_REQUEST_CODE: {
if (grantResults.length>0) {
boolean cameraAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
boolean storageAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
if (cameraAccepted && storageAccepted) {
pickFromCamera();
}else {
Toast.makeText(this, "Camera and storage permissions should be accepted.", Toast.LENGTH_SHORT).show();
}
}else {
}
}
break;
case STORAGE_REQUEST_CODE: {
if (grantResults.length>0) {
boolean storageAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
if (storageAccepted) {
pickFromGallery();
}else {
Toast.makeText(this, "Storage permissions should be accepted.", Toast.LENGTH_SHORT).show();
}
}
}
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_OK) {
if (resultCode == IMAGE_PICK_GALLERY_CODE) {
imageUri = data.getData();
try {
sendImageMessage(imageUri);
} catch (IOException e) {
e.printStackTrace();
}
}else if (requestCode == IMAGE_PICK_CAMERA_CODE) {
try {
sendImageMessage(imageUri);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Eh bien, je pense qu'il y a un bogue sur requestCode de la méthode onActivityResult. Y a-t-il une autre façon de faire cela?
2 réponses
Vous avez foiré le code de requête et le code de résultat dans onActivityResult
, en première ligne, vous comparez la requête et le résultat, ceux-ci ne seront jamais ==
(ou le seront toujours si IMAGE_PICK_GALLERY_CODE
est défini sur -1
comme RESULT_OK
est)
if (requestCode == RESULT_OK) {
if (resultCode == IMAGE_PICK_GALLERY_CODE) {
Certaines applications de caméra / galerie peuvent renvoyer un code de résultat erroné, tout en renvoyant également des données / images, il suffit donc de vérifier requestCode
et la bonne charge utile dans data
Intent
if (requestCode == IMAGE_PICK_GALLERY_CODE && data!= null) {
imageUri = data.getData();
if (imageUri != null)
...rest of code
else if (requestCode == IMAGE_PICK_CAMERA_CODE) {
...
D'après mon expérience, onActivityResult
est toujours appelé une fois que vous êtes revenu à votre activité depuis l'activité que vous avez ouverte à l'aide de startActivityForResult
Je crois que vous avez mélangé requestCode
et resultCode
. C'est le code de requête qui doit être IMAGE_PICK_GALLERY_CODE
ou IMAGE_PICK_CAMERA_CODE
.
Vous devez d'abord vérifier le code de la demande et ensuite seulement le code de résultat (peut-être qu'il y a des résultats personnalisés pour une demande spécifique).
De plus, je recommande d’ajouter des journaux juste après le démarrage de la fonction et d’imprimer tous les arguments pour faciliter le débogage.
Prendre plaisir :)
De nouvelles questions
java
Java est un langage de programmation de haut niveau. Utilisez cette balise lorsque vous rencontrez des problèmes pour utiliser ou comprendre la langue elle-même. Cette balise est rarement utilisée seule et est le plus souvent utilisée en conjonction avec [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] et [maven].