i have a fragment and from fragment need to upload images ,when pick image from gallery or camera fragment is destroying and host activity also destroying, and from second time onwards working perfectly.
please suggest me some solutions..
thanks in advance..
in the fragment class used these methods to call camera/gallery intents
private void takePhoto() {
Dexter.withActivity(getActivity())
.withPermissions(Manifest.permission.CAMERA)
.withListener(new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {
if (report.areAllPermissionsGranted()) {
/*Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent,PICK_FROM_CAMERA);*/
dispatchTakePictureIntent();
}
}
@Override
public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
token.continuePermissionRequest();
}
}).check();
}
private void openGallery() {
Dexter.withActivity(getActivity())
.withPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.withListener(new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {
if (report.areAllPermissionsGranted()) {
Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, PICK_FROM_GALLERY);
}
}
@Override
public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
token.continuePermissionRequest();
}
}).check();
}
very first time this method is not being called
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.e("makePayment", "onActivityResult");
if (resultCode != Activity.RESULT_OK)
return;
if (data == null)
return;
if (requestCode == PICK_FROM_GALLERY) {
Log.e("makePayment", "PICK_FROM_GALLERY");
Uri contentURI = data.getData();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(Objects.requireNonNull(getActivity()).getContentResolver(), contentURI);
if (isFromFront) {
pathFront = saveImage(bitmap);
mImageFileFront = new File(pathFront);
tvFront.setText(pathFront);
frontSide.setClipToOutline(true);
frontSide.setImageBitmap(bitmap);
} else {
pathBack = saveImage(bitmap);
mImageFileBack = new File(pathBack);
tvBack.setText(pathBack);
backSide.setClipToOutline(true);
backSide.setImageBitmap(bitmap);
}
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getActivity(), "Failed!", Toast.LENGTH_SHORT).show();
}
} else if (requestCode == PICK_FROM_CAMERA) {
try {
Log.e("makePayment", "PICK_FROM_CAMERA");
//Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), photoURI);
if (isFromFront) {
frontSide.setClipToOutline(true);
frontSide.setImageBitmap(BitmapFactory.decodeFile(pathFront));
} else {
backSide.setClipToOutline(true);
backSide.setImageBitmap(BitmapFactory.decodeFile(pathBack));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
fragment onSaveInstanceState implemented to store the instance
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("pathFront", pathFront);
}
fragment on View State Restored implemented to restore the instance
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
if (savedInstanceState != null) {
if (savedInstanceState.containsKey("pathFront")) {
pathFront = savedInstanceState.getString("pathFront");
}
}
}
in activity implemented on Activity Result and saved instance state methods but not working
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data){
super.onActivityResult(requestCode, resultCode, data);
List<Fragment> fragments = getSupportFragmentManager().getFragments();
for (Fragment fragment : fragments) {
if (fragment instanceof MakePayment) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
}
in activity implemented on Activity Result and saved instance state methods but not working
saved instance state to save the instance of fragment
@Override
protected void onSaveInstanceState(Bundle outState) {
if (mCurrentPhotoPath != null) {
outState.putString(CAPTURED_PHOTO_PATH_KEY, mCurrentPhotoPath);
}
if (mCapturedImageURI != null) {
outState.putString(CAPTURED_PHOTO_URI_KEY, mCapturedImageURI.toString());
}
this.getSupportFragmentManager().putFragment(outState, "myFragment", fragment);
super.onSaveInstanceState(outState);
}
onRestoreInstanceState to restore the saved instance of fragment
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
if (savedInstanceState.containsKey(CAPTURED_PHOTO_PATH_KEY)) {
mCurrentPhotoPath = savedInstanceState.getString(CAPTURED_PHOTO_PATH_KEY);
}
if (savedInstanceState.containsKey(CAPTURED_PHOTO_URI_KEY)) {
mCapturedImageURI = Uri.parse(savedInstanceState.getString(CAPTURED_PHOTO_URI_KEY));
}
fragment = getSupportFragmentManager().getFragment(savedInstanceState,"myFragment");
super.onRestoreInstanceState(savedInstanceState);
}