ACTION_SEND amacı için belirli uygulamaları filtreleme (ve her uygulama için farklı bir metin ayarlama)


187

ACTION_SEND amacını kullanırken belirli uygulamaları nasıl filtreleyebilirsiniz? Bu soru çeşitli şekillerde sorulmuştur, ancak verilen cevaplara dayalı bir çözüm bulamadım. Umarım birisi yardımcı olabilir. Bir uygulama içinde paylaşma yeteneği sağlamak istiyorum. Android Dev Alexander Lucas'ın tavsiyesini takiben , Facebook / Twitter API'larını değil, niyetleri kullanarak yapmayı tercih ederim.

ACTION_SEND amacını kullanarak paylaşma

ACTION_SEND amacını kullanarak paylaşmak harika, ama sorun şu ki (1) Orada her paylaşım seçeneğini istemiyorum, FB, Twitter ve E-posta ile sınırlamayı tercih ediyorum ve (2) paylaşmak istemiyorum her paylaşım uygulamasına aynı şey . Örneğin, Twitter paylaşımımda bazı bahsetmeler ve hashtag'ler 140 karakter veya daha azıyla sınırlı kalacağım, facebook paylaşımı ise bir bağlantı ve bir özellik resmi içerecek.

ACTION_SEND (paylaşım) amacı için seçenekleri sınırlamak mümkün müdür? PackageManager ve queryIntentActivities'i kullanma hakkında bir şey gördüm, ancak PackageManager ve ACTION_SEND amacı arasındaki bağlantıyı anlayamadım.

VEYA

Paylaşım uygulamalarını filtrelemek yerine, iletişim kutusunu açmak yerine doğrudan facebook veya twitter'a gitmek için ACTION_SEND amacını kullanabilirsem sorunum da çözülebilir. Eğer durum buysa, kendi diyaloğumu oluşturabilirdim ve "Facebook" u tıkladıklarında Facebook'a özel bir niyet oluşturun ve onları Facebook'a kadar gönderin. Twitter ile aynı.

VEYA mümkün değil mi? Facebook ve Twitter API'leri tek yol mu?


Olası yinelenen: [Yüklü-android-paket-adı üzerine-niyet-seçen-tabanlı özel filtre] [1] [1]: stackoverflow.com/questions/5734678/…
Asaf Pinhassi


2
hey arkadaşım ... Gönder düğmesine tıkladığımda paylaş iletişim kutusunu aç ve iletişim kutusunu paylaş "gmail, e-posta, zapiya, bağlantı" vb. ama facebook, whatsapp, facebook messanger, hangout'ları göstermiyor ... nasıl gösterebilirim?
GB_Bhayaniツ

android 6.0 üzerinde sadece bir öğe / niyet eylemi seçeneği olduğunda chooser göstermek nasıl? sorun android 6.0'dan daha az gösterilmez
zys

Yanıtlar:


324

Bildiğim kadarıyla, StackOverflow'un bu soruyu çeşitli şekillerde soran birçok insanı var, ancak henüz kimse tam olarak cevaplamadı.

Spesifikasyonum kullanıcının her biri için özel metin içeren e-posta, twitter, facebook veya SMS seçebilmesini istedi. İşte bunu nasıl başardım:

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

Bunu çeşitli yerlerde nasıl yapacağımla ilgili bitler buldum, ancak hepsini başka bir yerde görmedim.

Bu yöntemin, wifi ve bluetooth üzerinden paylaşmak gibi istemediğim tüm aptalca seçenekleri de gizlediğini unutmayın.

Umarım bu birine yardımcı olur.

Düzenleme: Bir yorumda, bu kodun ne yaptığını açıklamak istendi. Temel olarak, ACTION_SENDYALNIZCA yerel e-posta istemcisi için bir amaç yaratır ve daha sonra seçiciye diğer hedefleri tarar. Orijinal niyet e-postasına özgü yapmak, wifi ve bluetooth gibi tüm gereksiz önemsiz şeylerden kurtulur, daha sonra ACTION_SENDdüz metin türünün genel birinden istediğim diğer niyetleri alır ve seçiciyi göstermeden önce bunları takarım.

Ek amaçları aldığımda, her biri için özel metin ayarladım.

Edit2: Bunu yayınladığımdan beri bir süre oldu ve işler biraz değişti. Seçenekler listesinde iki kez gmail görüyorsanız, aşağıdaki @h_k tarafından bir yorumda önerildiği gibi "android.gm" için özel işlemeyi kaldırmayı deneyin.

Bu cevap neredeyse tüm stackoverflow itibar puanlarımın kaynağı olduğundan, en azından güncel tutmaya çalışmalıyım.


1
Bu kodu kullanıyorum, ancak bir şekilde evernote listeye gizlice giriyor. Paket adlarını kontrol ettiğimde, com.evernote, bu yüzden bunun neden olduğundan emin değilim.
James Harpe

1
@ user2249287 Atlanan mesajlaşma uygulamasını görene kadar kodda ilerlemenizi, ardından uygulamanın görünmesi için beyaz listeye eklemeniz gereken dizeyi belirlemek için paket adına bakın.
dacoinminster

1
@Gilbou Merhaba! Üzgünüm - bu koda baktığımdan beri uzun zaman geçti. . . Hatırladığım gibi, setPackage komutu, diğer her şeyi ekleyeceğiniz tek amacı seçer. Diğer çeşitli amaçları dahil etmek veya hariç tutmak için, kodun üzerinden geçmenizi ve Paket adlarına bakmanızı öneririz.
dacoinminster

2
SADECE kullanıcının sahip olduğu e-posta uygulamalarını filtrelemek için şu sorudan ikinci yanıtı kullanabilirsiniz: stackoverflow.com/questions/8701634/send-email-intent . Bu durumda EverNote gibi diğer uygulamaların da kullandığı bir veri tipi mesaj / rfc822 kullanılmasını gerektirmez.
mpellegr

2
@dacoinminster kodunuz, Twitter ve Whatsapp gibi uygulamalar için farklı metinler tanımlamama izin verdiği için harika oldu. Yinelenen gmail kaldırmak için, sadece "android.gm" denklemi çıkardı. Hala gmail alıyorum ve seçici listesinde yerleşik posta uygulaması var ve konu ve metin hala sağlam.
h_k

26

Özelleştirilmiş bir seçenek istiyorsanız, bu işlem için android tarafından sağlanan varsayılan iletişim kutusuna güvenmemelisiniz.

Bunun yerine yapmanız gereken, kendinizinkini çıkarmaktır. Gereksinim duyduğunuz eylemi hangi paketlerin işlediği PackageManager'ı sorgulamanız ve ardından yanıta göre filtreleme ve özelleştirilmiş metin uygulamanız gerekir.

Özellikle, yöntem bakmak queryIntentActivities ait PackageManager sınıfına. Varsayılan iletişim kutusunu (ACTION_SEND amacı) başlatacak amacı oluşturursunuz, bunu bu yönteme geçirirsiniz ve bu amacı işleyebilecek etkinliklerle ilgili bilgi içeren nesnelerin bir listesini alırsınız. Bunu kullanarak, istediklerinizi seçebilirsiniz.

Sunmak istediğiniz paketlerin listesini oluşturduktan sonra, bu listeyi görüntüleyecek olan kendi liste iletişim kutunuzu (tercihen iletişim kutusu temalı bir etkinlik) oluşturmanız gerekir.

Ancak dikkat edilmesi gereken bir şey, bu özel iletişim kutusunun varsayılan gibi görünmesinin çok zor olmasıdır. Sorun, bu iletişim kutusunda kullanılan temanın dahili bir tema olması ve uygulamanız tarafından kullanılamamasıdır. İstediğiniz gibi yerel olana benzer hale getirmeyi deneyebilir veya tamamen özel bir görünüm elde edebilirsiniz (birçok uygulama galeri uygulaması gibi yapar)


1
Farklı bir rotaya gitmiş olmama rağmen, orijinal yanıtı en yakından yanıtladığından bu cevabı doğru olarak işaretlemek (cevabımı görmek). Teşekkürler.
Kyle Clegg

22

Bunu sadece üç uygulamayı-Facebook, Twitter, KakaoStory - paylaşmak için deneyin.

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

belirli uygulamalarla paylaşmaya çalışıyorsanız bu kod mükemmel çalışır
Orcun Sevsay

22

Buraya bakmak benim için işe yarayan bir çözüm buldu (ilk cevap hakkındaki üçüncü yoruma bakın). Bu kod geçerli bir twitter istemcisi arar ve bunu tweet göndermek için kullanır. Not: Size çeşitli Twitter istemcileri ile bir niyet vermez ve seçim yapmanıza izin vermez.

Twitter kullanarak paylaş:

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

Bu yöntemin çağrılması:

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

Mesaj metnini hala ayarlayamasanız da Facebook " com.facebook.katana " ile benzer olacaktır (Temmuz 2011'de kullanımdan kaldırılmıştır).

Kod kaynağı: Android'de twitter istemcisi açma niyeti


4
Bu cevabı sevmiyorum çünkü tüm twitter uygulamalarının paket adlarını bilmeye dayanıyor. Başka bir yol için bkz. Stackoverflow.com/questions/6827407/…
Ed Burnette

Bağlandığınız cevabın benzer bir sorunu olmasına rağmen, size katılıyorum. Ben hiçbir kontrol veya dize değişmez garanti özellikle dize karşılaştırmalarına güvenmek asla.
Kyle Clegg

11

@Dacoinminster sayesinde. Yanıtında, popüler uygulamaların paket adları ve bu uygulamaların sıralanması da dahil olmak üzere bazı değişiklikler yapıyorum.

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

9

Aşağıdaki kodu deneyebilirsiniz, mükemmel çalışıyor.

Burada Facebook, Messenger, Twitter, Google Plus ve Gmail gibi bazı belirli uygulamalarla paylaşıyoruz.

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

"if (name.contains (" com.twitter.android.DMActivity ")) {devam;}
nedeni

8

Bu çözüm, bir ListView iletişim kutusundaki seçiciye benzeyen uygulamaların bir listesini gösterir:

ekran görüntüsü

Yapmak size kalmış:

  1. ilgili uygulama paketlerinin listesini alma
  2. bir paket adı verildi, ilgili amacı çağırın

Adaptör sınıfı:

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

}

ve kullanımı:

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

4

En temiz yol aşağıdaki sınıfları kopyalamaktır: ShareActionProvider, ActivityChooserView, ActivityChooserModel. ActivityChooserModel'deki amaçları ve ShareActionProvider'daki uygun destek yöntemlerini filtreleme yeteneğini ekleyin. Gerekli sınıfları oluşturdum, onları projenize kopyalayabilirsiniz ( https://gist.github.com/saulpower/10557956 ). Bu, yalnızca paylaşmak istediğiniz uygulamaları filtrelemekle kalmaz (paket adını biliyorsanız), aynı zamanda geçmişi de kapatabilir.

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

google + ve diğer uygulamaları içeren diğer seçenek nasıl eklenir
Sunishtha Singh

3

@Dacoinminster yanıtını geliştirdim ve bu, uygulamanızı paylaşmak için bir örnekle sonuçlandı:

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

Ben aynı sorunu vardı ve bu kabul edilmiş bir çözüm, bana yardımcı olmadı birisi aynı sorunu varsa kullanabileceğiniz benim kod parçacığını:

// 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
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, 
    Uri.fromParts("mailto", "android@gmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, text);
startActivity(Intent.createChooser(emailIntent, "Send email..."));

0

Çok basit ve özlü. Açık kaynak geliştiricisi sayesinde, bu çözümü paylaştığı için cketti :

String mailto = "mailto:bob@example.org" +
    "?cc=" + "alice@example.com" +
    "&subject=" + Uri.encode(subject) +
    "&body=" + Uri.encode(bodyText);

Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse(mailto));

try {
  startActivity(emailIntent);
} catch (ActivityNotFoundException e) {
  //TODO: Handle case where no email app is available
}

Ve bu onun özüne olan bağlantıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.