Selon une nouvelle fonctionnalité sur Android M (lien ici ), les applications situées en dehors de votre application peuvent offrir de donner une intention de partage direct à l’une de ses activités, permettant, par exemple, à une application de discussion partager le contenu avec un contact exact, de sorte que vous choisissiez à la fois l'application de conversation et le contact (une étape au lieu de deux). Cela peut être montré sur cette image:
Ou du moins c'est ce que j'ai compris de cela.
J'ai 2 questions concernant cette nouvelle fonctionnalité:
Dans la description, ils ne montrent que ce qu'il faut mettre dans le manifeste et ils mentionnent l'utilisation de "ChooserTargetService". Que faut-il faire pour fournir les textes et les images?
J'aimerais savoir comment faire l'inverse: comment interroger tous ces éléments "à partage direct" (images, textes et intentions) et pouvoir les afficher dans une boîte de dialogue personnalisée?
Je veux le faire parce que j'ai moi-même un dialogue personnalisé, qui permet de choisir quoi partager et comment, et pas seulement avec quelle application.
Question 1
Dans la description, ils ne montrent que ce qu'il faut mettre dans le manifeste et ils mentionnent l'utilisation de "ChooserTargetService". Que faut-il faire pour fournir les textes et les images?
Commencez par étendre ChooserTargetService
name__. Vous devez renvoyer un List
of ChooserTarget
et vous déterminez comment vous créez ces cibles.
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
Vous devez maintenant déclarer votre ChooserTargetService
dans votre AndroidManifest
et faire deux choses:
Service
en utilisant l’autorisation Android.permission.BIND_CHOOSER_TARGET_SERVICE
IntentFilter
avec l'action Android.service.chooser.ChooserTargetService
Par exemple:
<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>
Dans le Activity
qui va gérer le Intent
name__, vous devrez ajouter la balise meta-data
à Android.service.chooser.chooser_target_service
. Par exemple:
<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>
À partir de là, il suffit d'appeler Intent.createChooser
puis de gérer les données si l'utilisateur choisit votre application.
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"));
Résultats
Choses à noter
Le score de classement pour chaque ChooserTarget
sert à trier les cibles, mais uniquement si l’UI décide de l’utiliser. Selon ChooserTarget.getScore
L’interface utilisateur affichant la cible may prend en compte ce score lors du tri et de la fusion de cibles provenant de sources multiples
Aussi, autant que je sache, cette fonctionnalité n'est pas encore implémentée dans l'aperçu MNC d'Android. ChooserActivity
contient un TODO
pour celui-ci:
TODO: Maintenir le tri par classement
Lors de la création d'un nouveau Android.graphics.drawable.Icon
, vous devrez utiliser l'un des initialiseurs static
name__.
Icon.createWithBitmap();
Icon.createWithContentUri()
Icon.createWithData()
Icon.createWithFilePath()
Icon.createWithResource()
Question 2
J'aimerais savoir comment faire l'inverse: comment interroger tous ces éléments "à partage direct" (images, textes et intentions) et pouvoir les afficher dans une boîte de dialogue personnalisée?
Les données fournies à ChooserTargetService.onGetChooserTargets
sont dynamiques. Donc, il n'y a aucun moyen direct d'accéder à ces articles, autant que je sache.
J'ai une compréhension différente de cet avenir.
Jusqu'à présent, lorsqu'un utilisateur souhaitait partager quelque chose, il lui était demandé de choisir l'application avec laquelle il souhaitait partager, puis cette application gérait le partage.
Maintenant, au lieu de choisir l’application, l’utilisateur choisira le contenu de l’application qui gérera le partage. Chacune de ces options est encapsulée dans Android.service.chooser.ChooserTargetService
.
Comme vous le voyez sur l’image, certains produits de ChooserTargetService
apparaissent, l’utilisateur voit certains contacts sans déjeuner ni partage.
Je crois que votre dialogue pourrait être déclenché de la même manière.