Можно ли использовать createChooser, но на самом деле не начинать намерение (пока)? - PullRequest
1 голос
/ 17 мая 2019

В моем приложении есть кнопка «Поделиться», которая позволяет пользователю обмениваться текстом через другие приложения, такие как Messenger. Я использую createChooser, чтобы позволить пользователю выбрать приложение, которое он хочет использовать. Сложность в том, что после того, как они выбрали приложение, я не хочу сразу же запускать выбранное приложение, но мне нужно сначала пообщаться с сервером (чтобы получить точный текст для обмена), и я также хочу на этом этапе, чтобы вывести какое-то сообщение на экран, а затем я могу запустить общий доступ к выбранному приложению. Другими словами, chooser - это просто интерфейс для выбора, я не хочу, чтобы он фактически начал намерение; Я начну это вручную чуть позже.

Я пытался изменить намерения, которые собираются в селекторе, таким образом, чтобы они просто перенаправляли обратно в мое собственное приложение. Однако у меня проблема с сохранением их значков и ярлыков. Независимо от того, что я делаю, некоторые выборы всегда меняют свои значки и метки на значки моего собственного приложения.

Вот примерно так выглядит мой текущий код:

PackageManager pm = activity.getPackageManager();
Intent sendIntent = new Intent()
    .setAction(Intent.ACTION_SEND)
    .putExtra(Intent.EXTRA_TEXT, text)
    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    .setType("text/plain");

List<ResolveInfo> resInfo = pm.queryIntentActivities(sendIntent, PackageManager.MATCH_DEFAULT_ONLY);
List<LabeledIntent> intentList = new ArrayList<>();
for (ResolveInfo ri : resInfo) {
    String packageName = ri.activityInfo.packageName;
    String name = ri.activityInfo.name;
    if (name.contains("facebook.messenger")
        || name.contains("naver.line")
        || name.contains("android.mms")
        || name.contains("clipboard")
        ) {

        ComponentName cn = new ComponentName(packageName, name);
        Intent intent = new Intent(sendIntent)
            .setPackage(packageName)
            .setComponent(cn); // I tried to do somthing here but it doesn't work

        intentList.add(new LabeledIntent(intent, packageName, ri.loadLabel(pm), ri.icon));
        // loadLabel and icon doesn't always get the correct thing
    }
}

Intent first = intentList.remove(0);
Intent[] extra = intentList.toArray(new Intent[0]);

Intent receiver = new Intent(activity, ShareReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(activity, 0, receiver, PendingIntent.FLAG_UPDATE_CURRENT);
Intent chooser = Intent.createChooser(first, title, pendingIntent.getIntentSender());
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extra);
activity.startActivity(chooser);

1 Ответ

0 голосов
/ 17 мая 2019

"но мне нужно сначала установить связь с сервером"

  • Сохранять ли связь ранее, сохранять и использовать ее при необходимости?

"Выбор - это просто интерфейс для выбора, я не хочу, чтобы он фактически начал намерение; я начну это вручную немного позже."

  • Слышали ли вы о ModalBottomSheet справке для реализации собственного выбора по своему усмотрению.

"Я пытался изменить намерения, которые собираются в выбранном втаким образом, что они просто перенаправляют обратно в мое собственное приложение. "

  • Используйте startActivityForIntent в этом случае;когда вы намереваетесь создать приложение, закрыть его и вернуться обратно в свое приложение, обработайте его onActivityResult независимо от того, что вы хотите сделать.

"Однако у меня возникла проблема с сохранением их значков и меток".

  • Вы имеете в виду значки и ярлыки других приложений в диалоговом окне выбора?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...