wake-up-neo.net

So filtern Sie bestimmte Apps nach der Absicht ACTION_SEND (und legen für jede App einen anderen Text fest)

Wie können Sie bestimmte Apps herausfiltern, wenn Sie den ACTION_SEND-Intent verwenden? Diese Frage wurde auf verschiedene Arten gestellt, ich konnte jedoch keine sammeln Lösung basierend auf den gegebenen Antworten. Hoffentlich kann jemand helfen. Ich möchte die Möglichkeit zum Teilen in einer App bereitstellen. Befolgen Sie Rat von Android-Entwickler Alexander Lucas , ich würde es vorziehen, Absichten zu verwenden und nicht die Facebook/Twitter-APIs zu verwenden.

Sharing using ACTION_SEND intent

Das Teilen mit der Absicht ACTION_SEND ist großartig, aber das Problem ist (1) Ich möchte dort nicht jede Freigabeoption, sondern beschränke sie lieber auf FB, Twitter und E-Mail. 2) Ich möchte nicht für jede Sharing-App dasselbe freigeben . Zum Beispiel werde ich in meiner Twitter-Freigabe einige Erwähnungen und Hashtags auf 140 Zeichen oder weniger beschränken, während die Facebook-Freigabe einen Link und ein Funktionsbild enthalten wird.

Ist es möglich, die Optionen für die Absicht ACTION_SEND (Freigabe) zu beschränken? Ich habe etwas über die Verwendung von PackageManager und queryIntentActivities gesehen, konnte jedoch die Verbindung zwischen PackageManager und der Absicht ACTION_SEND nicht ermitteln.

OR

Anstatt die Freigabe-Apps zu filtern, könnte mein Problem auch gelöst werden, wenn ich die ACTION_SEND-Absicht verwenden könnte, um direkt zu Facebook oder Twitter zu wechseln, anstatt den Dialog aufzurufen. Wenn das der Fall wäre, könnte ich meinen eigenen Dialog erstellen und, wenn sie auf "Facebook" klicken, eine Facebook-spezifische Absicht erstellen und sie einfach ganz an Facebook senden. Gleiches gilt für Twitter.

ODER ist das nicht möglich? Sind die Facebook- und Twitter-APIs der einzige Weg?

172
Kyle Clegg

Meines Wissens hat StackOverflow viele Leute, die diese Frage auf verschiedene Arten stellen, aber noch niemand hat sie vollständig beantwortet.

Meine Spezifikation sah vor, dass der Benutzer E-Mails, Twitter, Facebook oder SMS mit benutzerdefiniertem Text für jede Nachricht auswählen kann. So habe ich das erreicht:

public void onShareClick(View v) {
    Resources resources = getResources();

    Intent emailIntent = new Intent();
    emailIntent.setAction(Intent.ACTION_SEND);
    // Native email client doesn't currently support HTML, but it doesn't hurt to try in case they fix it
    emailIntent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(resources.getString(R.string.share_email_native)));
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, resources.getString(R.string.share_email_subject));
    emailIntent.setType("message/rfc822");

    PackageManager pm = getPackageManager();
    Intent sendIntent = new Intent(Intent.ACTION_SEND);     
    sendIntent.setType("text/plain");


    Intent openInChooser = Intent.createChooser(emailIntent, resources.getString(R.string.share_chooser_text));

    List<ResolveInfo> resInfo = pm.queryIntentActivities(sendIntent, 0);
    List<LabeledIntent> intentList = new ArrayList<LabeledIntent>();        
    for (int i = 0; i < resInfo.size(); i++) {
        // Extract the label, append it, and repackage it in a LabeledIntent
        ResolveInfo ri = resInfo.get(i);
        String packageName = ri.activityInfo.packageName;
        if(packageName.contains("Android.email")) {
            emailIntent.setPackage(packageName);
        } else if(packageName.contains("Twitter") || packageName.contains("facebook") || packageName.contains("mms") || packageName.contains("Android.gm")) {
            Intent intent = new Intent();
            intent.setComponent(new ComponentName(packageName, ri.activityInfo.name));
            intent.setAction(Intent.ACTION_SEND);
            intent.setType("text/plain");
            if(packageName.contains("Twitter")) {
                intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.share_Twitter));
            } else if(packageName.contains("facebook")) {
                // Warning: Facebook IGNORES our text. They say "These fields are intended for users to express themselves. Pre-filling these fields erodes the authenticity of the user voice."
                // One workaround is to use the Facebook SDK to post, but that doesn't allow the user to choose how they want to share. We can also make a custom landing page, and the link
                // will show the <meta content ="..."> text from that page with our link in Facebook.
                intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.share_facebook));
            } else if(packageName.contains("mms")) {
                intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.share_sms));
            } else if(packageName.contains("Android.gm")) { // If Gmail shows up twice, try removing this else-if clause and the reference to "Android.gm" above
                intent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(resources.getString(R.string.share_email_gmail)));
                intent.putExtra(Intent.EXTRA_SUBJECT, resources.getString(R.string.share_email_subject));               
                intent.setType("message/rfc822");
            }

            intentList.add(new LabeledIntent(intent, packageName, ri.loadLabel(pm), ri.icon));
        }
    }

    // convert intentList to array
    LabeledIntent[] extraIntents = intentList.toArray( new LabeledIntent[ intentList.size() ]);

    openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
    startActivity(openInChooser);       
}

Ich habe an verschiedenen Stellen Anleitungen gefunden, aber ich habe nicht alles an einem anderen Ort gesehen.

Beachten Sie, dass diese Methode auch alle albernen Optionen verbirgt, die ich nicht möchte, wie das Teilen über WLAN und Bluetooth.

Hoffe das hilft jemandem.

Edit: In einem Kommentar wurde ich gebeten zu erklären, was dieser Code tut. Grundsätzlich wird ein ACTION_SEND - Intent nur für den nativen E-Mail-Client erstellt und anschließend andere Intents auf den Choser angewendet. Wenn Sie die ursprüngliche Absicht für E-Mails festlegen, wird der gesamte zusätzliche Müll wie WLAN und Bluetooth beseitigt. Dann greife ich zu den anderen Absichten, die ich von einem generischen ACTION_SEND - Nur-Text-Typ gewollt habe, und gehe sie an, bevor ich die Auswahl zeige .

Wenn ich die zusätzlichen Absichten ergreife, lege ich für jede einen benutzerdefinierten Text fest.

Edit2: Es ist schon eine Weile her, seit ich das gepostet habe, und die Dinge haben sich ein bisschen geändert. Wenn Sie Google Mail zweimal in der Liste der Optionen sehen, entfernen Sie die spezielle Behandlung für "Android.gm", wie in einem Kommentar von @h_k unten vorgeschlagen.

Da diese eine Antwort die Quelle für fast alle meine Stackoverflow-Reputationspunkte ist, muss ich zumindest versuchen, sie auf dem neuesten Stand zu halten.

304
dacoinminster

Wenn Sie eine benutzerdefinierte Option wünschen, sollten Sie sich bei dieser Aktion nicht auf das Standarddialogfeld von Android) verlassen.

Sie müssen stattdessen Ihre eigenen ausrollen. Sie müssen den PackageManager abfragen, für welche Pakete die von Ihnen gewünschte Aktion ausgeführt wird, und dann basierend auf der Antwort Filterung und benutzerdefinierten Text anwenden.

Sehen Sie sich insbesondere die Methode queryIntentActivities der Klasse PackageManager an. Sie erstellen die Absicht, mit der das Standarddialogfeld gestartet wird (die ACTION_SEND-Absicht), übergeben diese an diese Methode und erhalten eine Liste der Objekte, die Informationen zu den Aktivitäten enthalten, die diese Absicht verarbeiten können. Auf diese Weise können Sie die gewünschten auswählen.

Sobald Sie Ihre Liste der Pakete erstellt haben, die Sie präsentieren möchten, müssen Sie einen eigenen Listendialog (vorzugsweise eine Aktivität mit dem Dialogdesign) erstellen, in dem diese Liste angezeigt wird.

Zu beachten ist jedoch, dass es sehr schwierig ist, dieses benutzerdefinierte Dialogfeld als Standarddialogfeld festzulegen. Das Problem ist, dass das in diesem Dialogfeld verwendete Design ein internes Design ist und von Ihrer Anwendung nicht verwendet werden kann. Sie können entweder versuchen, es so ähnlich wie das native zu machen, wie Sie möchten, oder sich für ein vollständig benutzerdefiniertes Aussehen entscheiden (viele Apps machen das wie die Galerie-App usw.).

25

Probieren Sie diese App aus, um nur drei Apps zu teilen - Facebook, Twitter, KakaoStory.

public void onShareClick(View v){
    List<Intent> targetShareIntents=new ArrayList<Intent>();
    Intent shareIntent=new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.setType("text/plain");
    List<ResolveInfo> resInfos=getPackageManager().queryIntentActivities(shareIntent, 0);
    if(!resInfos.isEmpty()){
        System.out.println("Have package");
        for(ResolveInfo resInfo : resInfos){
            String packageName=resInfo.activityInfo.packageName;
            Log.i("Package Name", packageName);
            if(packageName.contains("com.Twitter.Android") || packageName.contains("com.facebook.katana") || packageName.contains("com.kakao.story")){
                Intent intent=new Intent();
                intent.setComponent(new ComponentName(packageName, resInfo.activityInfo.name));
                intent.setAction(Intent.ACTION_SEND);
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_TEXT, "Text");
                intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
                intent.setPackage(packageName);
                targetShareIntents.add(intent);
            }
        }
        if(!targetShareIntents.isEmpty()){
            System.out.println("Have Intent");
            Intent chooserIntent=Intent.createChooser(targetShareIntents.remove(0), "Choose app to share");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetShareIntents.toArray(new Parcelable[]{}));
            startActivity(chooserIntent);
        }else{
            System.out.println("Do not Have Intent");
            showDialaog(this);
        }
    }
}
22
user3098538

Ich habe eine Lösung gefunden, die für mich funktioniert und nach hier (siehe den dritten Kommentar zur ersten Antwort) sucht. Dieser Code sucht nach einem gültigen Twitter-Client und verwendet ihn, um den Tweet zu veröffentlichen. Hinweis: Es gibt Ihnen keine Absicht mit den verschiedenen Twitter-Clients und ermöglicht Ihnen die Auswahl.

Über Twitter teilen:

Intent shareIntent = findTwitterClient(); 
shareIntent.putExtra(Intent.EXTRA_TEXT, "test");
startActivity(Intent.createChooser(shareIntent, "Share"));

Aufruf dieser Methode:

public Intent findTwitterClient() {
    final String[] twitterApps = {
            // package // name - nb installs (thousands)
            "com.Twitter.Android", // official - 10 000
            "com.twidroid", // twidroid - 5 000
            "com.handmark.tweetcaster", // Tweecaster - 5 000
            "com.thedeck.Android" }; // TweetDeck - 5 000 };
    Intent tweetIntent = new Intent();
    tweetIntent.setType("text/plain");
    final PackageManager packageManager = getPackageManager();
    List<ResolveInfo> list = packageManager.queryIntentActivities(
            tweetIntent, PackageManager.MATCH_DEFAULT_ONLY);

    for (int i = 0; i < twitterApps.length; i++) {
        for (ResolveInfo resolveInfo : list) {
            String p = resolveInfo.activityInfo.packageName;
            if (p != null && p.startsWith(twitterApps[i])) {
                tweetIntent.setPackage(p);
                return tweetIntent;
            }
        }
    }

    return null;
}

Facebook wird mit " com.facebook.katana " ähnlich sein, obwohl Sie den Nachrichtentext immer noch nicht festlegen können (veraltet im Juli 2011).

Code-Quelle: Absicht, Twitter-Client auf Android zu öffnen

22
Kyle Clegg

Diese Lösung zeigt eine Liste von Anwendungen in einem ListView-Dialogfeld, das der Auswahl ähnelt:

screenshot

Es liegt an Ihnen:

  1. erhalten Sie die Liste der relevanten Anwendungspakete
  2. rufen Sie unter Angabe eines Paketnamens die entsprechende Absicht auf

Die Adapterklasse:

import Java.util.List;

import Android.content.Context;
import Android.content.pm.ApplicationInfo;
import Android.content.pm.PackageManager;
import Android.content.pm.PackageManager.NameNotFoundException;
import Android.graphics.drawable.Drawable;
import Android.util.TypedValue;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.ArrayAdapter;
import Android.widget.TextView;

public class ChooserArrayAdapter extends ArrayAdapter<String> {
    PackageManager mPm;
    int mTextViewResourceId;
    List<String> mPackages;

    public ChooserArrayAdapter(Context context, int resource, int textViewResourceId, List<String> packages) {
        super(context, resource, textViewResourceId, packages);
        mPm = context.getPackageManager();
        mTextViewResourceId = textViewResourceId;
        mPackages = packages;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String pkg = mPackages.get(position);
        View view = super.getView(position, convertView, parent);

        try {
            ApplicationInfo ai = mPm.getApplicationInfo(pkg, 0);

            CharSequence appName = mPm.getApplicationLabel(ai);
            Drawable appIcon = mPm.getApplicationIcon(pkg);

            TextView textView = (TextView) view.findViewById(mTextViewResourceId);
            textView.setText(appName);
            textView.setCompoundDrawablesWithIntrinsicBounds(appIcon, null, null, null);
            textView.setCompoundDrawablePadding((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 12, getContext().getResources().getDisplayMetrics()));
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }

        return view;
    }

}

und seine Verwendung:

    void doXxxButton() {
        final List<String> packages = ...;
        if (packages.size() > 1) {
            ArrayAdapter<String> adapter = new ChooserArrayAdapter(MyActivity.this, Android.R.layout.select_dialog_item, Android.R.id.text1, packages);

            new AlertDialog.Builder(MyActivity.this)
            .setTitle(R.string.app_list_title)
            .setAdapter(adapter, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int item ) {
                    invokeApplication(packages.get(item));
                }
            })
            .show();
        } else if (packages.size() == 1) {
            invokeApplication(packages.get(0));
        }
    }

    void invokeApplication(String packageName) {
        // given a package name, create an intent and fill it with data
        ...
        startActivityForResult(intent, rq);
    }

Sie können den folgenden Code ausprobieren, er funktioniert einwandfrei.

Hier teilen wir einige spezifische Apps, die Facebook, Messenger, Twitter, Google Plus und Gmail sind.

public void shareIntentSpecificApps() {
        List<Intent> intentShareList = new ArrayList<Intent>();
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.setType("text/plain");
        List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(shareIntent, 0);

        for (ResolveInfo resInfo : resolveInfoList) {
            String packageName = resInfo.activityInfo.packageName;
            String name = resInfo.activityInfo.name;
            Log.d(TAG, "Package Name : " + packageName);
            Log.d(TAG, "Name : " + name);

            if (packageName.contains("com.facebook") ||
                    packageName.contains("com.Twitter.Android") ||
                    packageName.contains("com.google.Android.apps.plus") ||
                    packageName.contains("com.google.Android.gm")) {

                if (name.contains("com.Twitter.Android.DMActivity")) {
                    continue;
                }

                Intent intent = new Intent();
                intent.setComponent(new ComponentName(packageName, name));
                intent.setAction(Intent.ACTION_SEND);
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_SUBJECT, "Your Subject");
                intent.putExtra(Intent.EXTRA_TEXT, "Your Content");
                intentShareList.add(intent);
            }
        }

        if (intentShareList.isEmpty()) {
            Toast.makeText(MainActivity.this, "No apps to share !", Toast.LENGTH_SHORT).show();
        } else {
            Intent chooserIntent = Intent.createChooser(intentShareList.remove(0), "Share via");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentShareList.toArray(new Parcelable[]{}));
            startActivity(chooserIntent);
        }
    }
8
Dang Nguyen

Vielen Dank an @dacoinminster. Ich habe einige Änderungen an seiner Antwort vorgenommen, einschließlich der Paketnamen der gängigen Apps und der Sortierung dieser Apps.

List<Intent> targetShareIntents = new ArrayList<Intent>();
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
PackageManager pm = getActivity().getPackageManager();
List<ResolveInfo> resInfos = pm.queryIntentActivities(shareIntent, 0);
if (!resInfos.isEmpty()) {
    System.out.println("Have package");
    for (ResolveInfo resInfo : resInfos) {
        String packageName = resInfo.activityInfo.packageName;
        Log.i("Package Name", packageName);

        if (packageName.contains("com.Twitter.Android") || packageName.contains("com.facebook.katana")
                || packageName.contains("com.whatsapp") || packageName.contains("com.google.Android.apps.plus")
                || packageName.contains("com.google.Android.talk") || packageName.contains("com.slack")
                || packageName.contains("com.google.Android.gm") || packageName.contains("com.facebook.orca")
                || packageName.contains("com.yahoo.mobile") || packageName.contains("com.skype.raider")
                || packageName.contains("com.Android.mms")|| packageName.contains("com.linkedin.Android")
                || packageName.contains("com.google.Android.apps.messaging")) {
            Intent intent = new Intent();

            intent.setComponent(new ComponentName(packageName, resInfo.activityInfo.name));
            intent.putExtra("AppName", resInfo.loadLabel(pm).toString());
            intent.setAction(Intent.ACTION_SEND);
            intent.setType("text/plain");
            intent.putExtra(Intent.EXTRA_TEXT, "https://website.com/");
            intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.share_text));
            intent.setPackage(packageName);
            targetShareIntents.add(intent);
        }
    }
    if (!targetShareIntents.isEmpty()) {
        Collections.sort(targetShareIntents, new Comparator<Intent>() {
            @Override
            public int compare(Intent o1, Intent o2) {
                return o1.getStringExtra("AppName").compareTo(o2.getStringExtra("AppName"));
            }
        });
        Intent chooserIntent = Intent.createChooser(targetShareIntents.remove(0), "Select app to share");
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetShareIntents.toArray(new Parcelable[]{}));
        startActivity(chooserIntent);
    } else {
        Toast.makeText(getActivity(), "No app to share.", Toast.LENGTH_LONG).show();
    }
}
7
Oguz Ozcan

Am einfachsten ist es, die folgenden Klassen zu kopieren: ShareActionProvider, ActivityChooserView, ActivityChooserModel. Fügen Sie die Funktion zum Filtern der Absichten im ActivityChooser-Modell und die entsprechenden Unterstützungsmethoden im ShareActionProvider hinzu. Ich habe die erforderlichen Klassen erstellt, Sie können sie in Ihr Projekt kopieren ( https://Gist.github.com/saulpower/10557956 ). Dies bietet nicht nur die Möglichkeit, die Apps zu filtern, mit denen Sie teilen möchten (wenn Sie den Paketnamen kennen), sondern auch den Verlauf zu deaktivieren.

private final String[] INTENT_FILTER = new String[] {
    "com.Twitter.Android",
    "com.facebook.katana"
};

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.journal_entry_menu, menu);

    // Set up ShareActionProvider's default share intent
    MenuItem shareItem = menu.findItem(R.id.action_share);

    if (shareItem instanceof SupportMenuItem) {
        mShareActionProvider = new ShareActionProvider(this);
        mShareActionProvider.setShareIntent(ShareUtils.share(mJournalEntry));
        mShareActionProvider.setIntentFilter(Arrays.asList(INTENT_FILTER));
        mShareActionProvider.setShowHistory(false);
        ((SupportMenuItem) shareItem).setSupportActionProvider(mShareActionProvider);
    }

    return super.onCreateOptionsMenu(menu);
}
4
saulpower
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, 
    Uri.fromParts("mailto", "[email protected]", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, text);
startActivity(Intent.createChooser(emailIntent, "Send email..."));
3
murugan

Ich habe die Antwort von @dacoinminster verbessert und dies ist das Ergebnis mit einem Beispiel für die Freigabe Ihrer App:

// 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()])));
3
user2528167

Ich hatte das gleiche Problem und diese akzeptierte Lösung hat mir nicht geholfen. Wenn jemand das gleiche Problem hat, können Sie mein Code-Snippet verwenden:

// example of filtering and sharing multiple images with texts
// remove facebook from sharing intents
private void shareFilter(){

    String share = getShareTexts();
    ArrayList<Uri> uris = getImageUris();

    List<Intent> targets = new ArrayList<>();
    Intent template = new Intent(Intent.ACTION_SEND_MULTIPLE);
    template.setType("image/*");
    List<ResolveInfo> candidates = getActivity().getPackageManager().
            queryIntentActivities(template, 0);

    // remove facebook which has a broken share intent
    for (ResolveInfo candidate : candidates) {
        String packageName = candidate.activityInfo.packageName;
        if (!packageName.equals("com.facebook.katana")) {
            Intent target = new Intent(Intent.ACTION_SEND_MULTIPLE);
            target.setType("image/*");
            target.putParcelableArrayListExtra(Intent.EXTRA_STREAM,uris);
            target.putExtra(Intent.EXTRA_TEXT, share);
            target.setPackage(packageName);
            targets.add(target);
        }
    }
    Intent chooser = Intent.createChooser(targets.remove(0), "Share Via");
    chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targets.toArray(new Parcelable[targets.size()]));
    startActivity(chooser);

}
3