Android - Как определить, выбрал ли пользователь, чтобы поделиться с Facebook или Twitter с помощью намерений?

Я создал приложение, которое делится на facebook, твиттер и т.д. Но я хочу выполнить различные функции , зависящие от того, кто пользователь делится на, например, если пользователь делится с Facebook, чтобы сделать что-то одно, но если пользователь делится твиттером, сделайте еще один.

Как это сделать?

Мой код до сих пор ниже:

private void ShareSub() {
    Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("text/plain");
    i.putExtra(
            Intent.EXTRA_TEXT,
            "You've just shared "
                    + "Awesome");
    startActivity(i);
}

Дальнейшее объяснение приведенного выше кода:

Когда пользователь нажимает кнопку "menu_item_share" на панели действий, запускается функция выше. Затем эта функция создает окно, подобное изображению ниже, которое позволяет пользователю выбрать конкретную опцию, например. Facebook или твиттер. Затем Intent.EXTRA_TEXT делится с этим конкретным приложением.

То, что я хочу, когда пользователь нажимает, например, на Facebook, определенная функция называется, например. Обмен через их (Facebook) api и т.д.

enter image description here

Я не использую ShareActionProvider, как показано ниже:

   <item
        android:id="@+id/your_share_item"
        android:actionProviderClass="android.widget.ShareActionProvider"
        android:showAsAction="ifRoom"
        android:title="@string/share"/>

Вместо этого я создал простую кнопку, которая вызывает функцию ShareSub:

<item
    android:id="@+id/menu_item_share"
    android:icon="@android:drawable/ic_menu_share"
    android:showAsAction="ifRoom"
    android:title="Share"/>

Причина, по которой я решил сделать это так, не хочу, чтобы кнопка недавно использовалась для, как показано на рисунке ниже. Это вызывает у меня проблемы, когда я пытаюсь использовать код, предложенный ниже, потому что я не использовал ShareActionProvider.

enter image description here

Ответ 1

Вы не можете напрямую узнать, какое приложение было выбрано, но вы можете отобразить собственное диалоговое окно Chooser.

Вместо вызова startActivity(i), получите список всех действий (facebook, twitter и т.д.), которые зарегистрированы для обработки вашего намерения, используя queryIntentActivities().

List<ResolveInfo> activities = getPackageManager().queryIntentActivities (i, 0);

Каждый ResolveInfo - это приложение, которое может обрабатывать ваши намерения. Теперь вы можете показать AlertDialog, содержащий список ярлыков или значков. Когда пользователь выбирает метку из списка, вы можете обработать то, что нужно сделать на основе приложения в обработчике кликов для диалога.

EDIT: здесь полный рабочий пример

private void ShareSub() {
    final Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("text/plain");
    i.putExtra(Intent.EXTRA_TEXT,"text");

    final List<ResolveInfo> activities = getPackageManager().queryIntentActivities (i, 0);

    List<String> appNames = new ArrayList<String>();
    for (ResolveInfo info : activities) {
        appNames.add(info.loadLabel(getPackageManager()).toString());
    }

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Complete Action using...");
    builder.setItems(appNames.toArray(new CharSequence[appNames.size()]), new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int item) {
            ResolveInfo info = activities.get(item);
            if (info.activityInfo.packageName.equals("com.facebook.katana")) {
                // Facebook was chosen
            } else if (info.activityInfo.packageName.equals("com.twitter.android")) {
                // Twitter was chosen
            }

            // start the selected activity
            i.setPackage(info.activityInfo.packageName);
            startActivity(i);
        }
    });
    AlertDialog alert = builder.create();
    alert.show();
}

Ответ 2

Использование нажатия кнопки на панели действий, которая запускает вышеуказанную функцию.

Если вы использовали ShareActionProvider, вы можете обнаружить, когда пользователь выбирает конкретное приложение из списка, реализуя ShareActionProvider.OnShareTargetSelectedListener. В противном случае вы не сможете определить, какое приложение выбрано, если вы не реализуете свой собственный выбор действий.

Вот пример:

меню

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/your_share_item"
        android:actionProviderClass="android.widget.ShareActionProvider"
        android:showAsAction="ifRoom"
        android:title="@string/share"/>

</menu>

Реализация

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate your menu
    getMenuInflater().inflate(R.menu.share, menu);

    // The Intent you want to share
    final Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("text/plain");
    i.putExtra(Intent.EXTRA_TEXT, "Test");

    // Set up your ShareActionProvider
    final ShareActionProvider shareActionProvider = (ShareActionProvider) menu.findItem(
            R.id.your_share_item).getActionProvider();
    shareActionProvider.setShareIntent(i);
    shareActionProvider.setOnShareTargetSelectedListener(new OnShareTargetSelectedListener() {

        @Override
        public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) {
            final String packageName = intent.getComponent().getPackageName();
            if (packageName.equals("com.facebook.katana")) {
                // Do something for Facebook
            } else if (packageName.equals("com.twitter.android")) {
                // Do something for Twitter
            }
            return false;
        }

    });
    return super.onCreateOptionsMenu(menu);
}

Ответ 3

Попробуйте ответить: здесь выберите определение, которое вы хотите:

Настроить Android Intent.ACTION_SEND

Включение дополнительных возможностей Android Share Intent в зависимости от того, какой метод они предпочитают использовать

Android - Как фильтровать определенные приложения для целей ACTION_SEND