Ответ 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"));
Результаты
Заметки
Оценка ранжирования для каждого 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
, являются динамическими. Итак, нет прямого способа доступа к этим элементам, насколько я знаю.