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
?
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
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);
}
}
}