web-dev-qa-db-fra.com

Obtention de l'objet IntentSender pour la méthode createChooser sous Android

Je voudrais utiliser la nouvelle version de Intent.createChooser method qui utilise IntentSender

La documentation indique seulement que je peux le récupérer à partir de l'instance PendingIntent. Dans mon cas, il semble que PendingIntent n'aura aucune autre utilisation.

Existe-t-il un autre moyen d’obtenir IntentSender ou dois-je créer PendingIntent?

27
pixel

l'intention de la cible du sélecteur n'est pas la PendingIntent. Par exemple, dans l'extrait suivant, je déclare l'intention pour ACTION_SEND, avec le type text/plain, et il s'agit de l'objectif cible pour Intent.createChooser. Ensuite, je crée une autre variable Intent, le récepteur et un gestionnaire, la PendingIntet, qui invoquera onReceive de ma BroadcastTest après avoir sélectionné quelque chose dans le sélecteur. 

Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
intent.setType("text/plain");
Intent receiver = new Intent(this, BroadcastTest.class);
receiver.putExtra("test", "test");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, receiver, PendingIntent.FLAG_UPDATE_CURRENT);
Intent chooser = Intent.createChooser(intent, "test", pendingIntent.getIntentSender());
startActivity(chooser);

Modifier

L'information, dans le cas de la BroadcastReceiver, est incorporée dans l'intention que vous obtenez en tant que paramètre. Une fois que vous avez sélectionné l’une des options, récupérez les extras de l’ensemble et en utilisant la clé Android.intent.extra.CHOSEN_COMPONENT, vous devriez pouvoir trouver ce que l’utilisateur a choisi.

Essayez d'ajouter aussi simple Log.d à onReceive 

for (String key : intent.getExtras().keySet()) {
    Log.d(getClass().getSimpleName(), " " + intent.getExtras().get(key));
}

Dans mon exemple, j'ai eu 

ComponentInfo{org.telegram.messenger/org.telegram.ui.LaunchActivity}

pour Telegram et 

ComponentInfo{com.google.Android.apps.inbox/com.google.Android.apps.bigtop.activities.ComposeMessageActivity}

pour InBox

43
Blackbelt

Une autre façon de le faire. 

    /**
     * Receiver to record the chosen component when sharing an Intent.
     */
    static class TargetChosenReceiver extends BroadcastReceiver {
        private static final String EXTRA_RECEIVER_TOKEN = "receiver_token";
        private static final Object LOCK = new Object();

        private static String sTargetChosenReceiveAction;
        private static TargetChosenReceiver sLastRegisteredReceiver;

        static boolean isSupported() {
            return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop_MR1;
        }

        @TargetApi(Build.VERSION_CODES.Lollipop_MR1)
        static void sendChooserIntent(Activity activity, Intent sharingIntent) {
            synchronized (LOCK) {
                if (sTargetChosenReceiveAction == null) {
                    sTargetChosenReceiveAction = activity.getPackageName() + "/"
                            + TargetChosenReceiver.class.getName() + "_ACTION";
                }
                Context context = activity.getApplicationContext();
                if (sLastRegisteredReceiver != null) {
                    context.unregisterReceiver(sLastRegisteredReceiver);
                }
                sLastRegisteredReceiver = new TargetChosenReceiver();
                context.registerReceiver(
                        sLastRegisteredReceiver, new IntentFilter(sTargetChosenReceiveAction));
            }

            Intent intent = new Intent(sTargetChosenReceiveAction);
            intent.setPackage(activity.getPackageName());
            intent.putExtra(EXTRA_RECEIVER_TOKEN, sLastRegisteredReceiver.hashCode());
            final PendingIntent callback = PendingIntent.getBroadcast(activity, 0, intent,
                    PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT);
            Intent chooserIntent = Intent.createChooser(sharingIntent,
                    activity.getString(R.string.share_link_chooser_title),
                    callback.getIntentSender());
            activity.startActivity(chooserIntent);
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            synchronized (LOCK) {
                if (sLastRegisteredReceiver != this) return;
                context.getApplicationContext().unregisterReceiver(sLastRegisteredReceiver);
                sLastRegisteredReceiver = null;
            }
            if (!intent.hasExtra(EXTRA_RECEIVER_TOKEN)
                    || intent.getIntExtra(EXTRA_RECEIVER_TOKEN, 0) != this.hashCode()) {
                return;
            }

            ComponentName target = intent.getParcelableExtra(Intent.EXTRA_CHOSEN_COMPONENT);
            if (target != null) {
                setLastShareComponentName(context, target);
            }
        }
    }
0
phnmnn