Get IntentSender object for createChooser method in Android

匿名 (未验证) 提交于 2019-12-03 02:00:02

问题:

I would like to use new version of Intent.createChooser method which uses IntentSender.

Documentation states only that I can grab it from PendingIntent instance. In my case it seems that PendingIntent won't have any other use.

Is there another way to obtain IntentSender or do I need create PendingIntent?

回答1:

the chooser target intent is not the PendingIntent. For instance, in the following snippet, I am declaring intent for ACTION_SEND, with type text/plain, and this is the my target intent for the Intent.createChooser. Then I am creating another Intent, receiver, and a handler, the PendingIntet, which will invoke onReceive of my BroadcastTest after one pick something from the 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); 

Edit:

The information, in the case of the BroadcastReceiver is embedded in the intent you get as parameter. After you selected one of the option, retrieve the Bundle's extras and using the key android.intent.extra.CHOSEN_COMPONENT, you should be able to find what the user picked.

Try adding as simple Log.d to onReceive

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

In my example I got

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

for Telegram and

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

for InBox



回答2:

Another way to do it.

    /**      * 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);             }         }     } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!