Как отфильтровать определенные приложения для намерения ACTION_SEND (и задать отдельный текст для каждого приложения) - PullRequest
171 голосов
/ 16 марта 2012

Как вы можете отфильтровать определенные приложения при использовании намерения ACTION_SEND? Этот вопрос задавался по-разному, но я не смог найти решение на основе полученных ответов. Надеюсь, кто-то может помочь. Я хотел бы предоставить возможность поделиться в приложении. Следуя совету разработчика Android от Александра Лукаса , я бы предпочел сделать это с помощью намерений, а не с помощью API Facebook / Twitter.

Sharing using ACTION_SEND intent

Совместный доступ с помощью намерения ACTION_SEND - это здорово, но проблема в том, что (1) я не хочу, чтобы там были доступны все варианты обмена, я бы предпочел ограничить их FB, Twitter и электронной почтой, и (2) я не хочу делить одно и то же с каждым приложением для совместного использования . Например, в свою долю в твиттере я собираюсь включить некоторые упоминания, и хэштеги ограничивают его до 140 символов или менее, в то время как доля в фейсбуке будет включать ссылку и изображение функции.

Можно ли ограничить параметры для намерения ACTION_SEND (поделиться)? Я видел кое-что об использовании PackageManager и queryIntentActivities, но не смог выяснить связь между PackageManager и намерением ACTION_SEND.

OR

Вместо того, чтобы фильтровать приложения для обмена, моя проблема также может быть решена, если бы я мог использовать намерение ACTION_SEND, чтобы перейти непосредственно на Facebook или Twitter, а не всплывать в диалоговом окне. Если бы это было так, то я мог бы создать свой собственный диалог, и когда они нажимают «Facebook», создают намерения, характерные для Facebook, и просто отправляют их на Facebook. То же самое с Twitter.

ИЛИ это невозможно? Являются ли API Facebook и Twitter единственным способом?

Ответы [ 11 ]

3 голосов
/ 04 августа 2014

Я улучшил ответ @dacoinminster, и вот результат с примером, чтобы поделиться вашим приложением:

// Intents with SEND action
PackageManager packageManager = context.getPackageManager();
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(sendIntent, 0);

List<LabeledIntent> intentList = new ArrayList<LabeledIntent>();
Resources resources = context.getResources();

for (int j = 0; j < resolveInfoList.size(); j++) {
    ResolveInfo resolveInfo = resolveInfoList.get(j);
    String packageName = resolveInfo.activityInfo.packageName;
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_SEND);
    intent.setComponent(new ComponentName(packageName,
    resolveInfo.activityInfo.name));
    intent.setType("text/plain");

    if (packageName.contains("twitter")) {
        intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.twitter) + "https://play.google.com/store/apps/details?id=" + context.getPackageName());
    } else {
        // skip android mail and gmail to avoid adding to the list twice
        if (packageName.contains("android.email") || packageName.contains("android.gm")) {
            continue;
        }
        intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.largeTextForFacebookWhatsapp) + "https://play.google.com/store/apps/details?id=" + context.getPackageName());
    }

    intentList.add(new LabeledIntent(intent, packageName, resolveInfo.loadLabel(packageManager), resolveInfo.icon));
}

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, resources.getString(R.string.subjectForMailApps));
emailIntent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.largeTextForMailApps) + "https://play.google.com/store/apps/details?id=" + context.getPackageName());

context.startActivity(Intent.createChooser(emailIntent, resources.getString(R.string.compartirEn)).putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray(new LabeledIntent[intentList.size()])));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...