onActivityResult 未传递 requestCode
onActivityResult not passing requestCode
在我的应用程序中,我编写了一个代码,当我从画廊或相机中选择图像时,图像应该在聊天中发送,但是当我这样做时,应用程序 returns 在聊天 activity 中没有发送的图像。下面是我编写的代码:
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();
}
}
}
}
嗯,我认为 onActivityResult 方法的 requestCode 有一个错误。还有其他方法吗?
你在 onActivityResult
中弄乱了请求代码和结果代码,在第一行你正在比较请求和结果,这些永远不会是 ==
(或者永远是 IMAGE_PICK_GALLERY_CODE
设置为 -1
如 RESULT_OK
is)
if (requestCode == RESULT_OK) {
if (resultCode == IMAGE_PICK_GALLERY_CODE) {
一些 camera/gallery 应用程序可能 return 错误的结果代码,仍然 returning 也 data/images,因此检查 requestCode
和 [=18 中的正确负载=] 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) {
...
根据我的经验,当您从使用 startActivityForResult
打开的 activity 返回到 activity 后,总是会调用 onActivityResult
我相信你介于 requestCode
和 resultCode
之间。
请求代码应该是 IMAGE_PICK_GALLERY_CODE
或 IMAGE_PICK_CAMERA_CODE
.
您应该首先检查请求代码,然后才检查结果代码(可能有特定请求的自定义结果)。
此外,我建议在函数启动后立即添加日志并打印所有参数以便于调试。
尽情享受吧:)
在我的应用程序中,我编写了一个代码,当我从画廊或相机中选择图像时,图像应该在聊天中发送,但是当我这样做时,应用程序 returns 在聊天 activity 中没有发送的图像。下面是我编写的代码:
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();
}
}
}
}
嗯,我认为 onActivityResult 方法的 requestCode 有一个错误。还有其他方法吗?
你在 onActivityResult
中弄乱了请求代码和结果代码,在第一行你正在比较请求和结果,这些永远不会是 ==
(或者永远是 IMAGE_PICK_GALLERY_CODE
设置为 -1
如 RESULT_OK
is)
if (requestCode == RESULT_OK) {
if (resultCode == IMAGE_PICK_GALLERY_CODE) {
一些 camera/gallery 应用程序可能 return 错误的结果代码,仍然 returning 也 data/images,因此检查 requestCode
和 [=18 中的正确负载=] 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) {
...
根据我的经验,当您从使用 startActivityForResult
onActivityResult
我相信你介于 requestCode
和 resultCode
之间。
请求代码应该是 IMAGE_PICK_GALLERY_CODE
或 IMAGE_PICK_CAMERA_CODE
.
您应该首先检查请求代码,然后才检查结果代码(可能有特定请求的自定义结果)。
此外,我建议在函数启动后立即添加日志并打印所有参数以便于调试。
尽情享受吧:)