web-dev-qa-db-ja.com

AndroidでcreateChooserメソッドのIntentSenderオブジェクトを取得します

IntentSenderを使用する Intent.createChooser メソッドの新しいバージョンを使用したいと思います。

ドキュメントには、PendingIntentインスタンスから取得できるとのみ記載されています。私の場合、PendingIntentは他の用途がないようです。

IntentSenderを取得する別の方法はありますか、それともPendingIntentを作成する必要がありますか?

30
pixel

チューザーターゲットインテントはPendingIntentではありません。たとえば、次のスニペットでは、ACTION_SENDのインテントをタイプtext/plainで宣言しています。これがIntent.createChooserのターゲットインテントです。次に、別のIntent、レシーバー、およびハンドラーPendingIntetを作成しています。これは、セレクターから何かを選択した後、onReceiveBroadcastTestを呼び出します。 。

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

編集

BroadcastReceiverの場合の情報は、パラメーターとして取得するインテントに埋め込まれます。オプションの1つを選択し、バンドルのエクストラを取得し、キーAndroid.intent.extra.CHOSEN_COMPONENTを使用すると、ユーザーが選択したものを見つけることができます。

シンプルなLog.donReceiveに追加してみてください

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

私の例では

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

Telegramおよび

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

InBox

46
Blackbelt

それを行う別の方法。

    /**
     * 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