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

На Android M, как настроить возможности "прямого доступа" (изображение, текст) и как запросить элементы?

Фон

Согласно новой функции на Android M (ссылка здесь), приложения за пределами вашего приложения могут предлагать прямое совместное намерение к одному из своих действий, позволяющее, например, чат-приложению делиться контентом с точным контактом, поэтому вы одновременно выбираете как приложение для общения, так и контакт (один шаг вместо 2). Это можно увидеть на этом изображении:

enter image description here

Или, по крайней мере, то, что я понял из него.

Вопрос

У меня есть 2 вопроса относительно этой новой функции:

  • В описании они только показывают, что добавить в манифест, и они упоминают использование "ChooserTargetService". Что нужно сделать для предоставления текстов и изображений?

  • Я хотел бы знать, как сделать обратное: как я могу запросить все эти элементы с прямым доступом (изображения, тексты и намерения) и показать их в настраиваемом диалоговом окне?

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

4b9b3361

Ответ 1

Вопрос 1

В описании они только показывают, что положить в манифест, и они упоминают использование "ChooserTargetService". Что нужно сделать в чтобы предоставить тексты и изображения?

Начните с расширения ChooserTargetService. Вам нужно будет вернуть List из ChooserTarget и то, как вы создаете эти цели, полностью зависит от вас.

public class YourChooserTargetService extends ChooserTargetService {

    @Override
    public List<ChooserTarget> onGetChooserTargets(ComponentName targetActivityName, IntentFilter matchedFilter) {
        final List<ChooserTarget> targets = new ArrayList<>();
        for (int i = 0; i < length; i++) {
            // The title of the target
            final String title = ...
            // The icon to represent the target
            final Icon icon = ...
            // Ranking score for this target between 0.0f and 1.0f
            final float score = ...
            // PendingIntent to fill in and send if the user chooses this target
            final PendingIntent action = ...
            targets.add(new ChooserTarget(title, icon, score, action));
        }
        return targets;
    }

}

AndroidManifest

Теперь вам нужно объявить свой ChooserTargetService в своем AndroidManifest и сделать две вещи:

  • Привязать Service с помощью разрешения android.permission.BIND_CHOOSER_TARGET_SERVICE
  • Включить IntentFilter с помощью действия android.service.chooser.ChooserTargetService

Например:

<service
    android:name=".YourChooserTargetService"
    android:label="@string/yourLabel"
    android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
    <intent-filter>
        <action android:name="android.service.chooser.ChooserTargetService" />
    </intent-filter>
</service>

В Activity, который будет обрабатывать Intent, вам нужно добавить тег meta-data android.service.chooser.chooser_target_service. Например:

<activity android:name=".YourShareActivity">

    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>

    <meta-data
        android:name="android.service.chooser.chooser_target_service"
        android:value=".YourChooserTargetService" />
</activity>

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

final Intent target = new Intent(Intent.ACTION_SEND);
target.setType("text/plain");
target.putExtra(Intent.EXTRA_TITLE, "Your title");
target.putExtra(Intent.EXTRA_TEXT, "Your text");
startActivity(Intent.createChooser(target, "ChooserTargetService Example"));

Результаты

results

Заметки

Оценка ранжирования для каждого ChooserTarget используется для сортировки целей, но используется только в том случае, если пользовательский интерфейс решает использовать его. Согласно ChooserTarget.getScore

Пользовательский интерфейс, отображающий цель может учитывать этот счет, когда сортировка и объединение целей из нескольких источников

Кроме того, насколько я знаю, эта функция пока еще не реализована в предварительном просмотре Android MNC. ChooserActivity содержит TODO для него:

TODO: Ведение сортировки по рейтингам

При создании нового android.graphics.drawable.Icon вам нужно будет использовать один из инициализаторов static.

Icon.createWithBitmap();
Icon.createWithContentUri()
Icon.createWithData()
Icon.createWithFilePath()
Icon.createWithResource()

Вопрос 2

Я хотел бы знать, как сделать обратное: как я могу запросить все эти элементы "прямого доступа" (изображения, тексты и намерения) и иметь возможность показывать их в настраиваемом диалоговом окне?

Данные, переданные в ChooserTargetService.onGetChooserTargets, являются динамическими. Итак, нет прямого способа доступа к этим элементам, насколько я знаю.

Ответ 2

У меня другое понимание этого будущего.

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

Теперь, вместо того, чтобы выбирать приложение, он выбирает контент из приложения, которое будет обрабатывать общий ресурс. Каждая такая опция инкапсулируется в android.service.chooser.ChooserTargetService.

Итак, как вы видите на изображении, он показывает некоторые продукты ChooserTargetService, пользователь видит некоторые контакты ui без обеда или совместного использования.

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