Cara memfilter aplikasi tertentu untuk maksud ACTION_SEND (dan mengatur teks yang berbeda untuk setiap aplikasi)

187

Bagaimana Anda bisa menyaring aplikasi tertentu saat menggunakan maksud ACTION_SEND? Pertanyaan ini telah ditanyakan dalam berbagai cara, tetapi saya belum dapat mengumpulkan solusi berdasarkan jawaban yang diberikan. Semoga ada yang bisa membantu. Saya ingin memberikan kemampuan untuk berbagi dalam suatu aplikasi. Mengikuti saran Android Dev Alexander Lucas , saya lebih suka melakukannya dengan maksud dan tidak menggunakan API Facebook / Twitter.

Berbagi menggunakan maksud ACTION_SEND

Berbagi menggunakan maksud ACTION_SEND sangat bagus, tetapi masalahnya adalah (1) Saya tidak ingin setiap opsi berbagi di sana, saya lebih suka membatasinya untuk FB, Twitter, dan Email, dan (2) Saya tidak ingin berbagi hal yang sama untuk setiap aplikasi berbagi . Sebagai contoh, di share twitter saya, saya akan memasukkan beberapa menyebutkan dan tagar terbatas hingga 140 karakter atau kurang, sedangkan share facebook akan menyertakan link dan gambar fitur.

Apakah mungkin membatasi opsi untuk maksud ACTION_SEND (bagi-pakai)? Saya telah melihat sesuatu tentang menggunakan PackageManager dan queryIntentActivities, tetapi belum dapat menemukan koneksi antara PackageManager dan maksud ACTION_SEND.

ATAU

Daripada memfilter aplikasi berbagi, masalah saya juga dapat diselesaikan jika saya bisa menggunakan niat ACTION_SEND untuk langsung ke facebook atau twitter daripada muncul dialog. Jika itu masalahnya maka saya bisa membuat dialog sendiri dan ketika mereka mengklik "Facebook", buat maksud khusus Facebook dan kirimkan saja semuanya ke Facebook. Sama dengan Twitter.

ATAU apakah itu tidak mungkin? Apakah API Facebook dan Twitter satu-satunya cara?

Kyle Clegg
sumber
Kemungkinan rangkap: [pemfilteran-atas-kehendak-pilihan-berdasarkan-instal-android-paket-nama] [1] [1]: stackoverflow.com/questions/5734678/…
Asaf Pinhassi
1
Blogpost ini tampaknya menjadi jawaban yang sempurna: hkdevtips.blogspot.com/2013/02/…
Vitali Olshevski
2
hai teman ... ketika saya klik tombol kirim saya kemudian buka dialog berbagi dan daftar dialog berbagi adalah "gmail, email, zapiya, hookup" dll tetapi tidak menunjukkan facebook, whatsapp, facebook messenger, kenaikan hangout ... bagaimana saya bisa menunjukkan itu ??
GB_Bhayani ツ
bagaimana tidak menunjukkan pemilih ketika hanya ada satu item / opsi tindakan niat di android 6.0? masalahnya tidak muncul di kurang dari android 6.0
zys

Jawaban:

324

Sepengetahuan saya, StackOverflow memiliki banyak orang yang mengajukan pertanyaan ini dengan berbagai cara, tetapi belum ada yang menjawab sepenuhnya.

Spek saya meminta pengguna untuk dapat memilih email, twitter, facebook, atau SMS, dengan teks khusus untuk masing-masing. Inilah cara saya mencapai hal itu:

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

Saya menemukan sedikit cara melakukan ini di berbagai tempat, tetapi saya belum melihat semuanya di satu tempat di tempat lain.

Perhatikan bahwa metode ini juga menyembunyikan semua opsi konyol yang tidak saya inginkan, seperti berbagi melalui wifi dan bluetooth.

Semoga ini bisa membantu seseorang.

Sunting: Dalam komentar, saya diminta menjelaskan apa yang dilakukan kode ini. Pada dasarnya, ini ACTION_SENDHANYA menciptakan niat untuk klien email asli, lalu menempelkan maksud lain ke pemilih. Menjadikan email asli maksud khusus menghilangkan semua sampah tambahan seperti wifi dan bluetooth, lalu saya ambil maksud lain yang saya inginkan dari generik ACTION_SENDtipe teks biasa, dan menempelkannya sebelum menunjukkan pemilih.

Ketika saya mengambil maksud tambahan, saya mengatur teks khusus untuk masing-masing.

Sunting2: Sudah beberapa saat sejak saya memposting ini, dan banyak hal telah berubah sedikit. Jika Anda melihat gmail dua kali dalam daftar opsi, coba hapus penanganan khusus untuk "android.gm" seperti yang disarankan dalam komentar oleh @h_k di bawah ini.

Karena jawaban yang satu ini adalah sumber dari hampir semua poin reputasi stackoverflow saya, saya harus setidaknya mencoba untuk tetap up to date.

dacoinminster
sumber
1
Saya menggunakan kode ini, tetapi entah bagaimana evernote menyelinap ke dalam daftar. Ketika saya memeriksa nama paket, itu com.evernote, jadi saya tidak yakin mengapa ini terjadi.
James Harpe
1
@ user2249287 Saya sarankan Anda menelusuri kode sampai Anda melihat aplikasi perpesanan yang dilewati, kemudian lihat nama paket untuk menentukan string apa yang perlu Anda tambahkan ke daftar putih aplikasi yang akan ditampilkan.
dacoinminster
1
@Gbou Hai! Maaf - sudah lama sejak saya melihat kode ini. . . Seingat saya, perintah setPackage memilih satu niat yang akan Anda tambahkan semuanya. Untuk memasukkan atau mengecualikan berbagai maksud lain, saya sarankan melangkah melalui kode dan melihat nama-nama Paket.
dacoinminster
2
Untuk memfilter HANYA aplikasi email yang dimiliki pengguna, Anda dapat menggunakan jawaban kedua dari pertanyaan ini: stackoverflow.com/questions/8701634/send-email-intent . Itu tidak memerlukan menggunakan tipe data pesan / rfc822 yang aplikasi lain, seperti EverNote dalam kasus ini, gunakan juga.
mpellegr
2
@dacoinminster kode Anda luar biasa karena memungkinkan saya menentukan teks yang berbeda untuk aplikasi seperti Twitter dan Whatsapp. Untuk menghapus duplikat gmail, saya hanya mengambil "android.gm" dari persamaan. Saya masih mendapatkan gmail dan aplikasi surat bawaan di daftar pemilih dan subjek serta teks masih utuh.
h_k
26

Jika Anda ingin opsi khusus maka Anda tidak harus bergantung pada dialog default yang disediakan oleh android untuk tindakan ini.

Yang harus Anda lakukan adalah menggelar sendiri. Anda akan perlu menanyakan PackageManager di mana paket menangani tindakan yang Anda butuhkan dan kemudian berdasarkan balasan, Anda menerapkan pemfilteran dan teks yang disesuaikan.

Secara khusus, lihat metode queryIntentActivities dari kelas PackageManager . Anda membangun maksud yang akan meluncurkan dialog default (maksud ACTION_SEND), meneruskannya ke metode ini dan Anda akan menerima daftar objek yang berisi info tentang kegiatan yang dapat menangani maksud itu. Dengan itu, Anda dapat memilih yang Anda inginkan.

Setelah Anda membuat daftar paket yang ingin Anda presentasikan, Anda perlu membuat dialog daftar Anda sendiri (lebih disukai aktivitas dengan tema dialog) yang akan menampilkan daftar itu.

Satu hal yang perlu diperhatikan adalah sangat sulit untuk membuat dialog kustom tersebut terlihat seperti yang default. Masalahnya adalah bahwa tema yang digunakan dalam dialog itu adalah tema internal dan tidak dapat digunakan oleh aplikasi Anda. Anda dapat mencoba membuatnya mirip dengan yang asli seperti yang Anda inginkan atau menggunakan tampilan yang sepenuhnya khusus (banyak aplikasi melakukannya seperti aplikasi galeri dll.)

Savvas Dalkitsis
sumber
1
Menandai jawaban ini benar karena paling dekat menjawab pertanyaan awal, meskipun akhirnya saya menempuh rute yang berbeda (lihat jawaban saya). Terima kasih.
Kyle Clegg
22

Coba yang ini untuk berbagi hanya tiga aplikasi-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);
        }
    }
}
pengguna3098538
sumber
kode ini berfungsi sempurna jika Anda mencoba berbagi dengan aplikasi tertentu
Orcun Sevsay
22

Menemukan solusi yang cocok untuk saya yang mencari di sini (lihat komentar ketiga pada jawaban pertama). Kode ini mencari klien twitter yang valid dan menggunakannya untuk memposting tweet. Catatan: Itu tidak memberi Anda Intent dengan berbagai klien Twitter dan memungkinkan Anda untuk memilih.

Bagikan menggunakan twitter:

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

Memanggil metode ini:

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 akan serupa dengan menggunakan " com.facebook.katana ", meskipun Anda masih tidak dapat mengatur teks pesan (usang Juli 2011).

Sumber kode: Maksud untuk membuka klien twitter di Android

Kyle Clegg
sumber
4
Saya tidak suka jawaban ini karena ini bergantung pada mengetahui nama paket semua aplikasi twitter. Untuk cara lain, lihat stackoverflow.com/questions/6827407/…
Ed Burnette
Saya setuju dengan Anda, meskipun jawaban yang Anda tautkan memiliki masalah serupa. Saya tidak pernah suka mengandalkan perbandingan string terutama ketika saya tidak memiliki kontrol atau menjamin string tidak akan berubah.
Kyle Clegg
11

Terima kasih kepada @dacoinminster. Saya membuat beberapa modifikasi pada jawabannya termasuk nama paket aplikasi populer dan pengurutan aplikasi tersebut.

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();
    }
}
Oguz Ozcan
sumber
9

Anda dapat mencoba kode di bawah ini, ini berfungsi dengan sempurna.

Di sini kami berbagi ke beberapa aplikasi tertentu, yaitu Facebook, Messenger, Twitter, Google Plus dan Gmail.

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);
        }
    }
Dang Nguyen
sumber
apa alasan untuk "if (name.contains (" com.twitter.android.DMActivity ")) {continue;}?
isJulian00
8

Solusi ini menunjukkan daftar aplikasi dalam dialog ListView yang menyerupai pemilih:

tangkapan layar

Terserah Anda untuk:

  1. dapatkan daftar paket aplikasi yang relevan
  2. diberi nama paket, aktifkan maksud yang relevan

Kelas adaptor:

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

}

dan penggunaannya:

    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);
    }
18446744073709551615
sumber
4

Cara terbersih adalah menyalin kelas berikut: ShareActionProvider, ActivityChooserView, ActivityChooserModel. Tambahkan kemampuan untuk memfilter maksud di ActivityChooserModel, dan metode dukungan yang sesuai di ShareActionProvider. Saya membuat kelas yang diperlukan, Anda dapat menyalinnya ke proyek Anda ( https://gist.github.com/saulpower/10557956 ). Ini tidak hanya menambah kemampuan untuk memfilter aplikasi yang ingin Anda bagikan (jika Anda tahu nama paket), tetapi juga untuk mematikan riwayat.

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);
}
saulpower
sumber
bagaimana cara menambahkan google + dan opsi lain yang berisi aplikasi
remaing
3

Saya telah meningkatkan jawaban @dacoinminster dan ini adalah hasil dengan contoh untuk membagikan aplikasi Anda:

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

sumber
3

Saya memiliki masalah yang sama dan solusi yang diterima ini tidak membantu saya, jika seseorang memiliki masalah yang sama Anda dapat menggunakan potongan kode saya :

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

}
jemo mgebrishvili
sumber
3
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..."));
murugan
sumber
0

Sangat sederhana dan ringkas. Terima kasih kepada pengembang Open source, cketti untuk berbagi solusi ini:

String mailto = "mailto:[email protected]" +
    "?cc=" + "[email protected]" +
    "&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
}

Dan ini adalah tautan ke intinya.

pengguna10496632
sumber