web-dev-qa-db-fra.com

Sur Android M, comment configurer les fonctionnalités de "partage direct" (image, texte) et comment interroger les éléments?

Contexte

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:

enter image description here

Ou du moins c'est ce que j'ai compris de cela.

La question

J'ai 2 questions concernant cette nouvelle fonctionnalité:

  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?

  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?

    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.

19

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 ChooserTargetServicename__. Vous devez renvoyer un Listof ChooserTargetet 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 ChooserTargetServicedans votre AndroidManifestet faire deux choses:

  1. Lier le Serviceen utilisant l’autorisation Android.permission.BIND_CHOOSER_TARGET_SERVICE
  2. Inclure un IntentFilteravec 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 Activityqui va gérer le Intentname__, 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

results

Choses à noter

Le score de classement pour chaque ChooserTargetsert à 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. ChooserActivitycontient un TODOpour 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 staticname__.

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.

17
adneal

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.

0
Ilya Gazman