Android - обрезка изображения не загружает изображение
Я хочу вырезать фотографию, сделанную из галереи или камеры. Но я не вижу фото при кадрировании. Это просто не приходит. Я беру фото с камеры и начинаю резку. Экран выглядит примерно так:
Камера и onActivityResult
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = image.getAbsolutePath();
return image;
}
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
Log.d("FotografHata",""+ex);
}
// Continue only if the File was successfully created
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(this,
"com.maksu.aquarium.fileprovider",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
Uri uri = Uri.parse(currentPhotoPath);
openCropActivity(uri, uri);
} else if (requestCode == UCrop.REQUEST_CROP && resultCode == RESULT_OK) {
Uri uri = UCrop.getOutput(data);
}
}
openCropActivity
private void openCropActivity(Uri girenUri, Uri cikanUri) {
UCrop.of(girenUri, cikanUri)
.withAspectRatio(16, 9)
.start(this);
}
2 ответа
Решение:
Я использую библиотеку Multi-Picker для использования фотографий из галереи и выбора фотографий. После того, как фотография выбрана, я открываю фотографию - это библиотека ucrop.
поместите ниже класса в свой проект.
Следуя Кодексу:
private String filePath;
private ImagePicker imagePicker;
private CameraImagePicker cameraImagePicker;
private void pickImage() {
//showProgressBarWithoutHide();
if (AppUtils.isValidContext(activity)) {
imagePicker = new ImagePicker(activity);
imagePicker.setImagePickerCallback(pickerCallback);
//imagePicker.allowMultiple(); // Default is false
imagePicker.shouldGenerateMetadata(false); // Default is true
imagePicker.shouldGenerateThumbnails(false); // Default is true
imagePicker.pickImage();
}
}
private void cameraImg() {
if (AppUtils.isValidContext(activity)) {
if (!SystemUtils.checkForCamera(activity)) {
Snackbar.make(btnAddToGallery, "Your device doesn't support camera", Snackbar.LENGTH_LONG).show();
return;
}
cameraImagePicker = new CameraImagePicker(activity);
cameraImagePicker.setImagePickerCallback(pickerCallback);
cameraImagePicker.shouldGenerateMetadata(false); // Default is true
cameraImagePicker.shouldGenerateThumbnails(false); // Default is true
filePath = cameraImagePicker.pickImage();
Log.i(TAG, "filepath: " + filePath);
}
}
ImagePickerCallback pickerCallback = new ImagePickerCallback() {
@Override
public void onImagesChosen(List<ChosenImage> list) {
try {
Log.i(TAG, "onImagesChosen() " + list.size());
if (list.size() == 0) {
Snackbar.make(btnAddToGallery, R.string.err_failed_to_pick_img, Snackbar.LENGTH_LONG).show();
return;
}
final ChosenImage chosenImage = list.get(0);
if (AppUtils.isValidContext(activity) && isAdded()) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (chosenImage != null) {
Log.i(TAG, "getOriginalPath Path:" + chosenImage.getOriginalPath());
validateImagePath(chosenImage.getOriginalPath());
} else {
//hideProgressBar();
Snackbar.make(btnAddToGallery, "Failed to choose image", Snackbar.LENGTH_LONG).show();
Log.e(TAG, "Failed to choose image");
}
}
});
}
} catch (Throwable th) {
th.printStackTrace();
}
}
@Override
public void onError(String s) {
//hideProgressBar();
}
};
private void validateImagePath(String imagePath) {
String ext = FileUtils.getFileExtension(imagePath);
Log.i(TAG, "EXT: " + ext);
if (ext.equals("jpg") || ext.equals("png") || ext.equals("jpeg")) {
if (imagePath != null) {
File file = new File(imagePath);
long length = file.length();
Log.i(TAG, "File size is: " + length);
if (length > Constants.MAX_IMAGE_FILE_SIZE) {
//hideProgressBar();
Snackbar.make(btnAddToGallery, getString(R.string.err_img_too_large), Snackbar.LENGTH_LONG).show();
FileUtils.deleteFileFromPath(filePath);
return;
}
filePath = imagePath;
PerformCrop();
} else {
//hideProgressBar();
Toast.makeText(activity, R.string.err_failed_to_pick_img, Toast.LENGTH_SHORT).show();
}
} else {
//hideProgressBar();
Snackbar.make(btnAddToGallery, "Please select valid file.", Snackbar.LENGTH_LONG).show();
Log.e(TAG, "Please select valid file");
}
}
openCropActivity:
private void PerformCrop() {
try {
Uri sourceUri = Uri.parse("file://" + filePath);
Uri destUri = Uri.fromFile(new File(activity.getFilesDir(), "U_Crop_Image_" + System.currentTimeMillis() + ".png"));
UCrop uCrop = UCrop.of(sourceUri, destUri); //Uri.fromFile(new File(getCacheDir(), destinationFileName))
uCrop = basisConfig(uCrop);
uCrop = advancedConfig(uCrop);
uCrop.start(activity);
} catch (Throwable e) {
e.printStackTrace();
}
}
onActivityResult:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case Picker.PICK_IMAGE_DEVICE:
if (resultCode == Activity.RESULT_OK && data != null) {
if (imagePicker == null && AppUtils.isValidContext(activity)) {
imagePicker = new ImagePicker(activity);
imagePicker.setImagePickerCallback(pickerCallback);
}
if (imagePicker != null) {
imagePicker.submit(data);
}
} else {
Log.e(TAG, "PICK_IMAGE_DEVICE intent is null or result code is " + resultCode);
}
break;
case Picker.PICK_IMAGE_CAMERA:
if (resultCode == Activity.RESULT_OK && data != null) {
if (cameraImagePicker == null && AppUtils.isValidContext(activity)) {
cameraImagePicker = new CameraImagePicker(activity);
cameraImagePicker.reinitialize(filePath);
// OR in one statement
// imagePicker = new CameraImagePicker(Activity.getActivity(), outputPath);
cameraImagePicker.setImagePickerCallback(pickerCallback);
}
if (cameraImagePicker != null) {
cameraImagePicker.submit(data);
}
} else {
Log.e(TAG, "PICK_IMAGE_CAMERA intent is null or result code is " + resultCode);
if (filePath != null && filePath.length() > 0) {
PerformCrop();
} else {
Snackbar.make(btnAddToGallery, R.string.err_failed_to_pick_img, Snackbar.LENGTH_LONG).show();
}
}
break;
case UCrop.REQUEST_CROP:
if (resultCode == Activity.RESULT_OK) {
final Uri resultUri = UCrop.getOutput(data);
Log.e(TAG, "Cropped image: " + resultUri);
try {
if (resultUri != null && resultUri.toString().length() > 0) {
/* Remove dummy image */
// set crop Image...
}
} catch (Throwable e) {
e.printStackTrace();
}
//showCropAd();
} else if (resultCode == UCrop.RESULT_ERROR) {
try {
final Throwable cropError = UCrop.getError(data);
if (cropError != null && cropError.getMessage() != null) {
Log.e(TAG, "cropError: " + cropError.getMessage());
}
} catch (Throwable e) {
e.printStackTrace();
}
}
break;
}
}
Результат:
Демонстрация моего приложения после изображения:
Этот код только для справки. Если вы по-прежнему сталкиваетесь с какими-либо проблемами, сообщите мне. Рад помочь вам.
Я проходил источник и пункт назначения
Uri
используя
Uri.parse(myFile)
так он продолжал загружаться
Что сработало для меня, так это то, что я использовал
toUri()
, как это
val sourceUri = myFile.toUri()