Подтвердить что ты не робот

Предназначение для выбора обоев с подсветкой обоев

Я хотел бы знать, возможно ли создать Intent, что делает подсветку обоев галереи. Эта функция была введена в Honeycomb. Чтобы получить представление о том, что я ищу, посмотрите на планшет на изображении (три синих прямоугольника).

Я посмотрел исходный код в приложении галереи ICS, но я не смог найти то, что искал.

this

4b9b3361

Ответ 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 class onActivityResult).

К сожалению, по какой-то причине команда 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).

Если что-нибудь, надеюсь, это поможет вам в правильном направлении. Дайте мне знать, как это происходит, и оставьте комментарий, если вы хотите, чтобы я что-то разъяснил.

Ответ 2

Я помогу:

public class CropSelectedImageActivity extends Activity {

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
            photoPickerIntent.setType("image/*");
            startActivityForResult(photoPickerIntent, 1);
}

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == RESULT_OK) {
                    final Bundle extras = data.getExtras();
                    Uri photoUri = data.getData();
                    if (photoUri != null) {
                            Intent intent = new Intent("com.android.camera.action.CROP");
                    //intent.setClassName("com.android.camera", "com.android.camera.CropImage");

                    intent.setData(photoUri);
                    intent.putExtra("outputX", 96);
                    intent.putExtra("outputY", 96);
                    intent.putExtra("aspectX", 1);
                    intent.putExtra("aspectY", 1);
                    intent.putExtra("scale", true);
                    intent.putExtra("return-data", true);            
                    startActivityForResult(intent, 1);
                    }
            }
    }
}

взято из: ImageCropper

Ответ 3

Я не пробовал, но если вы посмотрите здесь

         Bundle newExtras = new Bundle();
         // maybe that here - for more options see your source code link
         newExtras.putString("circleCrop", "true");
         Intent cropIntent = new Intent();
         // Uri would be something from MediaStore.Images.Media.EXTERNAL_CONTENT_URI
         cropIntent.setData(img.fullSizeImageUri());
         // edit: it inside com.android.gallery in case that is even installed.
         // should work if you replace that with setClassName("com.android.gallery", "com.android.camera.CropImage")
         cropIntent.setClass(this, CropImage.class);
         cropIntent.putExtras(newExtras);
         startActivityForResult(cropIntent, CROP_MSG);

Тогда это может сработать для вас.

Выбирайте намерение, возможно, таким образом:

Intent i = new Intent(Intent.ACTION_PICK);
i.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivity(i);

Ответ 4

Существует хорошая библиотека, основанная на экране обрезки ICS (из приложения галереи), здесь.

Вы можете изменить его в соответствии с вашими потребностями, чтобы выбрать часть, подлежащую обрезке.

Код основан на приложении Android Gallery (ссылка здесь) в разделе "/com/android/камера/галерея", а самый важный класс - "CropImage" в "/com/android/camera/". Он доступен для всех даже в случае отсутствия библиотеки (код Google всегда доступен):

git clone https://android.googlesource.com/platform/packages/apps/Gallery3D/

(и даже если это не будет доступно, я уверен, что будут другие)

Преимущества по сравнению с другими решениями здесь:

  • независимая
  • настраиваемый
  • не может произойти сбой из-за изменений в ПЗУ. Другие решения предполагают существование точных классов и приложений.
  • с открытым исходным кодом.
  • реальная реализация, а не начало намерения для другого приложения.
  • другие решения сильно не рекомендуются, просто из-за использования неофициальных намерений, как написано здесь. Это написано очень известным пользователем StackOverflow под названием " CommonsWare, который очень уважаемый пользователь, на который можно рассчитывать во многих Темы, связанные с Android.

Опять же, наиболее рекомендуемая вещь для обрезки изображений по-прежнему является сторонней библиотекой. Не использовать обходные пути намерений.

Ответ 5

Просто сделай это!

Intent intent = new Intent(Intent.ACTION_ATTACH_DATA).setDataAndType(contentUri,  "image/jpeg")
    .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
    .putExtra("mimeType", "image/jpeg");
startActivity(Intent.createChooser(intent, getString(R.string.set_as)));

который "image/jpeg" является изображением mimeType, contentUri - это изображение uri