В штатном приложении камеры возможно ли передать URI для функции CROP так же, как это делается для функции TAKE?

Кто-нибудь исследовал исходный код камеры Android? В нем присутствует интересный интент com.android.camera.action.CROP и модификатор return-data: если он установлен в true, то возвращается битмап, а если в false, то - ссылка на сохраненное изображение. Возможно ли дополнительно указать URL, куда сохранить обрезанное изображение, подобно тому, как это делает функция TakePicture?
  • 27 октября 2024 г. 10:32
Ответы на вопрос 2
В стандартном приложении камеры Android действительно существует интент для обрезки изображения, который называется `com.android.camera.action.CROP`. Однако различные реализации этого интента могут значительно различаться между устройствами и версиями Android, так как многие производители модифицируют стандартные приложения под свои нужды.

По умолчанию интент `com.android.camera.action.CROP` поддерживает опцию `return-data`, которая определяет, как будет возвращён результат. Установка `return-data` в true приведет к возврату битмапа, тогда как false вернёт URI сохраненного изображения. Однако, стандартный способ передачи URI для сохранения обрезанного изображения непосредственно через интент CROP не поддерживается.

Вот несколько моментов, которые следует учитывать:

1. **Передача URI**: Обычно для передачи URI в интент CROP используется параметр `output`, где можно указать место сохранения результата. Пример:
   ```java
   Intent intent = new Intent("com.android.camera.action.CROP");
   intent.setDataAndType(imageUri, "image/*");
   intent.putExtra("crop", "true");
   intent.putExtra("output", outputUri); // Здесь указываете URI для сохранения
   startActivityForResult(intent, CROP_IMAGE_REQUEST);
   ```

2. **Непредсказуемость**: Как упоминалось ранее, не все устройства корректно обрабатывают интент CROP. Некоторые устройства могут игнорировать параметр `output` и возвращать результат в другом формате (например, через `return-data`).

3. **Проверка устройства**: Чтобы обеспечить максимально совместимый опыт, в приложении можно реализовать проверку устройства и предоставить альтернативные способы обрезки, если стандартный способ не работает. Например, можно использовать сторонние библиотеки для редактирования изображений.

4. **Исходный код**: Если вас интересует подробная реализация заброшенного функционала, вы можете исследовать исходный код библиотек Android, чтобы понять, как реализованы соответствующие функции. Это может помочь вам лучше понять, что можно изменять или как можно адаптировать решение в вашем приложении.

В общем, если вы хотите использовать стандартное поведение обрезки изображений, стоит использовать параметр `output`. Однако будьте готовы тестировать на разных устройствах для обеспечения правильной работы вашего приложения.
CropExtras(extras.getInt(CropExtras.KEY_OUTPUT_X, 0),
                    extras.getInt(CropExtras.KEY_OUTPUT_Y, 0),
                    extras.getBoolean(CropExtras.KEY_SCALE, true) &&
                            extras.getBoolean(CropExtras.KEY_SCALE_UP_IF_NEEDED, false),
                    extras.getInt(CropExtras.KEY_ASPECT_X, 0),
                    extras.getInt(CropExtras.KEY_ASPECT_Y, 0),
                    extras.getBoolean(CropExtras.KEY_SET_AS_WALLPAPER, false),
                    extras.getBoolean(CropExtras.KEY_RETURN_DATA, false),
                    (Uri) extras.getParcelable(MediaStore.EXTRA_OUTPUT),
                    extras.getString(CropExtras.KEY_OUTPUT_FORMAT),
                    extras.getBoolean(CropExtras.KEY_SHOW_WHEN_LOCKED, false),
                    extras.getFloat(CropExtras.KEY_SPOTLIGHT_X),
                    extras.getFloat(CropExtras.KEY_SPOTLIGHT_Y));

откопал в исходниках.
Похожие вопросы