Это один из самых популярных вопроса. Мы можем найти много сообщений об этой проблеме. Но ни один из них не полезен для меня.
Поэтому я решил эту проблему, используя это решение.
Давайте сначала поймем, почему это происходит.
Мы можем назвать startActivityForResult
непосредственно из фрагмента, но на самом деле механик за все обработаны деятельности.
После того, как вы называете startActivityForResult
из фрагмента, requestCode будет изменен, чтобы прикрепить идентификатор фрагмента к коду. Это позволит Activity отслеживать, кто отправляет этот запрос после получения результата.
После того, как операция была перенесена обратно, результат будет отправлен в Activity onActivityResult Activity с измененным кодом запроса, который будет декодирован до исходного идентификатора requestCode + Fragment. После этого Activity отправит результат активности на этот фрагмент через onActivityResult. И все сделано.
Проблема заключается в том:
активность может отправить результат только фрагмент, который был прикреплен непосредственно к деятельности, но не вложенную один. Вот почему onActivityResult вложенного фрагмента никогда не вызывался ни на что.
Решение:
1) Запустить Intent камеры в вашем фрагменте кода с помощью ниже:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Fragment frag = this;
/** Pass your fragment reference **/
frag.startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); // REQUEST_IMAGE_CAPTURE = 12345
2) Теперь в вашем Родитель активность переопределение ** onActivityResult()
: **
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
Вы должны вызвать это в родительской деятельности, чтобы заставить его работать.
3) В вашем фрагменте вызова:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
if (requestCode == REQUEST_IMAGE_CAPTURE) {
// Do something with imagePath
Bitmap photo = (Bitmap) data.getExtras().get("data");
imageview.setImageBitmap(photo);
// CALL THIS METHOD TO GET THE URI FROM THE BITMAP
Uri selectedImage = getImageUri(getActivity(), photo);
String realPath=getRealPathFromURI(selectedImage);
selectedImage = Uri.parse(realPath);
}
}
}
4) Ссылочные методы для получения URI:
-> Метод для получения Ури из Bitmap
public Uri getImageUri(Context inContext, Bitmap inImage) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
return Uri.parse(path);
}
-> Метод для getti нг путь к файлу от Uri
public String getRealPathFromURI(Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = { MediaStore.Images.Media.DATA };
cursor = getActivity().getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} finally {
if (cursor != null) {
cursor.close();
}
}
}
Вот и все. С помощью этого решения он может применяться для любого отдельного фрагмента, независимо от того, является он вложенным или нет. И да, это также охватывает весь случай! Кроме того, коды также хороши и чисты.
IS, что onActivityResult на фрагмент или активность? – Maxrunner
my onActivityResult не является тригером. Я помещаю оба этих метода в свой фрагмент. есть ли что-нибудь еще, что я должен делать? – FilipLuch
OnActivityResult запускается в активности, которая называется фрагментом –