Ответ 1
Я хотел бы знать, возможно ли создать намерение, которое делает в галерее обрезка обоев обоев.
Предполагая, что ваше приложение должно корректно вести себя на всех устройствах Android, ответ отрицательный. Ни активность обрезки, ни выделенный вид посева не являются частью публичного API; оба являются внутренними для приложения Gallery 3D. Другими словами, вы могли бы потратить все время в мире, пытаясь найти действие Intent
, чтобы заставить вас магически работать на вас, но дело в том, что некоторые устройства просто не поддерживают его. Например, многие устройства, такие как HTC Sense и Samsung Galaxy, настроили Android-версии, у которых есть собственное приложение для галереи. Поскольку эти приложения Gallery специфичны для компаний, которые их разработали, эти устройства не обязательно будут иметь класс CropImage
для запуска.
При этом, чтобы гарантировать, что ваше приложение работает на всех устройствах, вам нужно будет включить код обрезки непосредственно в ваш проект. И если по какой-то причине вы обнаружите способ запуска активности урожая с помощью Intent, вы должны проверить, существует ли пакет com.android.gallery3d
, по крайней мере, и обрабатывать его каким-то образом.
Я включил ниже рабочий стол, который может помочь вам включить код Android в ваш проект. В настоящее время у меня нет доступа к планшету с поддержкой Honeycomb/ICS, поэтому я не могу быть более конкретным в отношении того, как заставить его работать с новыми версиями Android, но я полагаю, что он предполагает аналогичный анализ и немного копирования и вставки из пакета com.android.gallery3d
.
Повторное использование "Активность урожая" на Android 2.x
Я протестировал это на своем Nexus One, и перед тем, как появился мягкий прямоугольник "crop-прямоугольник", я получил следующий вывод logcat:
I/ActivityManager( 94): Starting: Intent {
act=android.intent.action.CHOOSER
cmp=android/com.android.internal.app.ChooserActivity (has extras) } from pid 558
I/ActivityManager( 94): Starting: Intent {
act=android.intent.action.ATTACH_DATA
dat=content://media/external/images/media/648
typ=image/jpeg
flg=0x3000001
cmp=com.google.android.gallery3d/com.cooliris.media.Photographs (has extras) } from pid 558
I/ActivityManager( 94): Starting: Intent {
dat=content://media/external/images/media/648
cmp=com.google.android.gallery3d/com.cooliris.media.CropImage (has extras) } from pid 558
Итак, из того, что я могу сказать, последовательность событий, которая возникает при выполнении этого действия, выглядит следующим образом:
- Перейдите к изображению в галерее и выберите "установить как...". Появится
ActivityChooser
, и вы выбираете "Обои". -
Этот выбор запускает
Intent
с действиемATTACH_DATA
и компонентомcom.cooliris.media.Photographs
, который является классом в Android фреймворк, который служит в качестве "подборщика обоев" для приложения камеры; он просто перенаправляется на стандартное действие выбора. Так как мы далиIntent
URI, который задает образ для установки в качестве обоев, этот класс неизбежно выполнит следующий код (см. Метод классаonResume
):Intent intent = new Intent(); intent.setClass(this, CropImage.class); intent.setData(imageToUse); formatIntent(intent); startActivityForResult(intent, CROP_DONE);
-
Это вызывает еще один
Intent
, который запускаетCropImage
Активность... здесь вы указываете обрезанную область, используя мягкий прямоугольник. Когда вы укажете растение, результат будет равенRESULT_OK
с помощьюrequestCode = CROP_DONE
. Переключатели активностиPhotographs
по этим двум константам, а затем соответственно устанавливают обои (см. МетодPhotographs
classonActivityResult
).
К сожалению, по какой-то причине команда Android решила удалить эти функции из SDK, начиная с API 4 (Android v1.6)... поэтому, если вы хотите запустить Intent
для выполнения этой точной последовательности событий, вам потребуется просеять пакет com.cooliris.media
и скопировать и вставить соответствующие классы в ваш проект. В моем прошлом опыте это часто больше проблем, чем того стоит (если только это не выполняется относительно простое действие), но это определенно возможно.
Вот хороший учебник о том, как вы можете упростить процесс... он требует, чтобы вы копировали и вставляли 12 классов Java в ваш проект, а не весь пакет com.cooliris.media
. Эти классы вместе должны быть достаточными для правильного запуска действия CropImage
, но вам нужно будет установить обои вручную по результату CropImage
Activity.
Также обратите внимание, что представленный пример кода предполагает, что вы хотите обрезать сразу же после того, как камера сделала снимок. Чтобы, например, запустить CropImage
Activity с предварительно выбранным изображением из галереи, вы должны вызвать
Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, ACTIVITY_SELECT_IMAGE);
а затем в onActivityResult
(если requestCode == ACTIVITY_SELECT_IMAGE
и resultCode == RESULT_OK
) запустите CropImage
Activity с данными Uri, указанными в третьем аргументе onActivityResult
(см. пример кода для примера о том, как запуск Activity).
Если что-нибудь, надеюсь, это поможет вам в правильном направлении. Дайте мне знать, как это происходит, и оставьте комментарий, если вы хотите, чтобы я что-то разъяснил.