Obtenir L'objet IntentSender pour la méthode createChooser dans Android

je voudrais utiliser une nouvelle version de Intention.createChooser méthode qui utilise IntentSender.

la Documentation indique seulement que je peux l'attraper de PendingIntent instance. Dans mon cas, il semble que PendingIntent ne pas avoir de toute autre utilisation.

Est-il une autre façon d'obtenir IntentSender ou dois-je le créer PendingIntent?

24
demandé sur pixel 2015-06-04 01:28:16

2 réponses

le choix de la cible n'est pas le PendingIntent. Par exemple, dans l'extrait suivant, je déclare l'intention de ACTION_SEND, avec le type text/plain, et c'est la ma cible de l'intention de l' Intent.createChooser. Puis je me suis créer un autre Intent, récepteur, et un handler, le PendingIntet appeler onReceive mon BroadcastTest après un choisir quelque chose dans le chooser.

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 du BroadcastReceiver est incorporé dans l'intention vous obtenez comme paramètre. Après avoir sélectionné l'une des options, récupérez les extras du paquet et utilisez la touche android.intent.extra.CHOSEN_COMPONENT, vous devriez pouvoir trouver ce que l'Utilisateur a choisi.

Essayez d'ajouter aussi simple Journal.donReceive

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

Dans mon exemple, j'ai

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

Telegram et

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

InBox

39
répondu Blackbelt 2015-06-10 07:37:24

une Autre façon de 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
répondu phnmnn 2017-07-04 09:13:27