public
class
TakePhotoFragment
extends
Fragment {
private
FragmentTakePhotoBinding binding;
private
Uri photoUri;
public
TakePhotoFragment() {
}
@Override
public
View onCreateView(
@NonNull
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = FragmentTakePhotoBinding.inflate(inflater, container,
false
);
return
binding.getRoot();
}
@Override
public
void
onViewCreated(
@NonNull
View view,
@Nullable
Bundle savedInstanceState) {
super
.onViewCreated(view, savedInstanceState);
binding.takePhotoBtn.setOnClickListener(v ->
requestPermissionOrTakePhoto()
);
}
@Override
public
void
onDestroyView() {
super
.onDestroyView();
binding =
null
;
}
private
final
ActivityResultLauncher<String> permissionResult = registerForActivityResult(
new
ActivityResultContracts.RequestPermission(),
new
ActivityResultCallback<Boolean>() {
@Override
public
void
onActivityResult(Boolean isGranted) {
photoUri = takePhoto();
}
}
);
private
final
ActivityResultLauncher<Uri> takeImageResult = registerForActivityResult(
new
ActivityResultContracts.TakePicture(),
new
ActivityResultCallback<Boolean>() {
@Override
public
void
onActivityResult(Boolean isSuccess) {
if
(!isSuccess)
return
;
loadImage(photoUri);
}
}
);
private
Uri createPhotoUri()
throws
IOException {
return
FileProvider.getUriForFile(requireContext(),
"com.example.myapplication.fileprovider"
,
createImageFile()
);
}
private
File createImageFile()
throws
IOException {
@SuppressLint
(
"SimpleDateFormat"
) String timeStamp =
new
SimpleDateFormat(
"yyyyMMdd_HHmmss"
).format(
new
Date());
String imageFileName =
"JPEG_"
+ timeStamp +
"_"
;
File storageDir = requireActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
return
File.createTempFile(
imageFileName,
);
}
private
boolean
cameraPermissionGranted() {
return
ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED;
}
private
void
requestCameraPermission() {
permissionResult.launch(Manifest.permission.CAMERA);
}
private
void
requestPermissionOrTakePhoto() {
if
(!cameraPermissionGranted()) {
requestCameraPermission();
return
;
}
photoUri = takePhoto();
}
private
Uri takePhoto() {
try
{
Uri photoUri = createPhotoUri();
takeImageResult.launch(photoUri);
return
photoUri;
}
catch
(IOException e) {
e.printStackTrace();
}
return
null
;
}
private
void
loadImage(Uri uri) {
Glide.with(requireView())
.load(uri)
.placeholder(R.drawable.lake)
.into(binding.imageView);
}
}