Cách lọc các ứng dụng cụ thể cho mục đích ACTION_SEND (và đặt một văn bản khác nhau cho mỗi ứng dụng)


187

Làm cách nào bạn có thể lọc các ứng dụng cụ thể khi sử dụng mục đích ACTION_SEND? Câu hỏi này đã được hỏi theo nhiều cách khác nhau, nhưng tôi chưa thể thu thập một giải pháp dựa trên các câu trả lời được đưa ra. Hy vọng ai đó có thể giúp đỡ. Tôi muốn cung cấp khả năng chia sẻ trong một ứng dụng. Theo lời khuyên của Android Dev Alexander Lucas , tôi muốn thực hiện bằng cách sử dụng ý định và không sử dụng API Facebook / Twitter.

Chia sẻ bằng cách sử dụng ý định ACTION_SEND

Chia sẻ bằng cách sử dụng mục đích ACTION_SEND là rất tốt, nhưng vấn đề là (1) Tôi không muốn mọi tùy chọn chia sẻ ở đó, tôi muốn giới hạn ở FB, Twitter và Email và (2) Tôi không muốn chia sẻ điều tương tự cho mỗi ứng dụng chia sẻ . Ví dụ: trong chia sẻ twitter của tôi, tôi sẽ đưa vào một số đề cập và hashtag giới hạn ở mức 140 ký tự hoặc ít hơn, trong khi chia sẻ trên facebook sẽ bao gồm một liên kết và hình ảnh đặc trưng.

Có thể giới hạn các tùy chọn cho mục đích ACTION_SEND (chia sẻ) không? Tôi đã thấy điều gì đó về việc sử dụng Gói Trình quản lý và truy vấnIntentActivities, nhưng không thể tìm ra kết nối giữa Gói Trình quản lý và mục đích ACTION_SEND.

HOẶC LÀ

Thay vì lọc các ứng dụng chia sẻ, vấn đề của tôi cũng có thể được giải quyết nếu tôi có thể sử dụng ý định ACTION_SEND để truy cập trực tiếp vào facebook hoặc twitter thay vì bật lên hộp thoại. Nếu đó là trường hợp thì tôi có thể tạo hộp thoại của riêng mình và khi họ nhấp vào "Facebook", hãy tạo một mục đích cụ thể của Facebook và chỉ cần gửi chúng đến Facebook. Tương tự với Twitter.

Hay là điều này không thể thực hiện được? Có phải API của Facebook và Twitter là cách duy nhất?


Có thể trùng lặp: [tùy chỉnh bộ lọc tùy ý-người chọn dựa trên cài đặt-tên-gói-android] [1] [1]: stackoverflow.com/questions/5734678/
trộm


2
này bạn ơi ... khi tôi bấm vào nút gửi của mình thì mở hộp thoại chia sẻ và danh sách hộp thoại chia sẻ là "gmail, email, zapiya, hookup", v.v. nhưng không hiển thị facebook, whatsapp, facebook messanger, đi lang thang ... làm thế nào tôi có thể hiển thị ??
GB_Bhayani

Làm thế nào để không hiển thị trình chọn khi chỉ có một mục / tùy chọn hành động có chủ ý trên Android 6.0? vấn đề không hiển thị trên Android 6.0
zys

Câu trả lời:


324

Theo hiểu biết của tôi, StackOverflow có rất nhiều người hỏi câu hỏi này theo nhiều cách khác nhau, nhưng chưa có ai trả lời hoàn toàn.

Thông số kỹ thuật của tôi kêu gọi người dùng có thể chọn email, twitter, facebook hoặc SMS, với văn bản tùy chỉnh cho từng người. Đây là cách tôi hoàn thành nó:

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

Tôi đã tìm thấy những cách để làm điều này ở nhiều nơi, nhưng tôi chưa thấy tất cả ở một nơi khác.

Lưu ý rằng phương pháp này cũng ẩn tất cả các tùy chọn ngớ ngẩn mà tôi không muốn, như chia sẻ qua wifi và bluetooth.

Hy vọng điều này sẽ giúp được ai đó.

Chỉnh sửa: Trong một bình luận, tôi được yêu cầu giải thích mã này đang làm gì. Về cơ bản, nó tạo ra một ACTION_SENDý định cho CHỈ khách hàng email gốc, sau đó xử lý các ý định khác đối với người chọn. Làm cho mục đích ban đầu cụ thể của email được loại bỏ tất cả các rác bổ sung như wifi và bluetooth, sau đó tôi lấy các ý định khác mà tôi muốn từ một ACTION_SENDloại văn bản đơn giản và xử lý chúng trước khi hiển thị trình chọn.

Khi tôi lấy các ý định bổ sung, tôi đặt văn bản tùy chỉnh cho từng mục.

Edit2: Đã được một lúc kể từ khi tôi đăng bài này, và mọi thứ đã thay đổi một chút. Nếu bạn đang thấy gmail hai lần trong danh sách các tùy chọn, hãy thử xóa xử lý đặc biệt cho "android.gm" như được đề xuất trong một nhận xét của @h_k bên dưới.

Vì câu trả lời này là nguồn gốc của gần như tất cả các điểm danh tiếng stackoverflow của tôi, nên ít nhất tôi phải cố gắng cập nhật nó.


1
Tôi đang sử dụng mã này, nhưng bằng cách nào đó evernote đang lẻn vào danh sách. Khi tôi kiểm tra tên gói, đó là com.evernote, vì vậy tôi không chắc tại sao điều này lại xảy ra.
James Harpe

1
@ user2249287 Tôi khuyên bạn nên thực hiện mã cho đến khi bạn thấy ứng dụng nhắn tin bị bỏ qua, sau đó nhìn vào packagename để xác định chuỗi nào bạn cần thêm vào danh sách trắng ứng dụng đó sẽ xuất hiện.
dacoinminster

1
@Gilbou Xin chào! Xin lỗi - đã lâu rồi tôi mới xem mã này. . . Như tôi nhớ lại, lệnh setPackage chọn mục đích duy nhất mà bạn sẽ nối thêm mọi thứ khác vào. Để bao gồm hoặc loại trừ các ý định khác nhau, tôi khuyên bạn nên chuyển qua mã và xem tên Gói.
dacoinminster

2
Để lọc CHỈ các ứng dụng email mà người dùng có, bạn có thể sử dụng câu trả lời thứ hai từ câu hỏi này: stackoverflow.com/questions/8701634/send-email-intent . Nó không yêu cầu sử dụng loại dữ liệu của tin nhắn / rfc822 mà các ứng dụng khác, chẳng hạn như EverNote trong trường hợp này, cũng sử dụng.
mpellegr

2
@dacoinminster mã của bạn thật tuyệt vời khi cho phép tôi xác định văn bản khác nhau cho các ứng dụng như Twitter và Whatsapp. Để xóa gmail trùng lặp, tôi chỉ cần lấy "android.gm" ra khỏi phương trình. Tôi vẫn nhận được gmail và ứng dụng thư tích hợp trong danh sách người chọn và chủ đề và văn bản vẫn còn nguyên.
h_k

26

Nếu bạn muốn một tùy chọn tùy chỉnh thì bạn không nên dựa vào hộp thoại mặc định do Android cung cấp cho hành động này.

Thay vào đó, những gì bạn cần làm là tự mình tung ra. Bạn sẽ cần phải truy vấn PackageManager mà trên đó các gói xử lý các hành động mà bạn yêu cầu và sau đó dựa trên câu trả lời, bạn áp dụng lọc và văn bản tùy chỉnh.

Cụ thể, hãy xem phương thức queryIntentActivities của lớp PackageManager . Bạn xây dựng ý định sẽ khởi chạy hộp thoại mặc định (ý định ACTION_SEND), chuyển nó sang phương thức này và bạn sẽ nhận được một danh sách các đối tượng có chứa thông tin về các hoạt động có thể xử lý ý định đó. Sử dụng điều đó, bạn có thể chọn những người bạn muốn.

Khi bạn xây dựng danh sách các gói bạn muốn trình bày, bạn cần xây dựng hộp thoại danh sách của riêng bạn (tốt nhất là một hoạt động với chủ đề hộp thoại) sẽ hiển thị danh sách đó.

Một điều cần lưu ý là rất khó để làm cho hộp thoại tùy chỉnh đó trông giống như hộp thoại mặc định. Vấn đề là chủ đề được sử dụng trong hộp thoại đó là một chủ đề nội bộ và ứng dụng của bạn không thể sử dụng. Bạn có thể cố gắng làm cho nó giống với bản gốc như bạn muốn hoặc có giao diện hoàn toàn tùy chỉnh (nhiều ứng dụng làm như ứng dụng thư viện, v.v.)


1
Đánh dấu câu trả lời này là chính xác vì nó trả lời gần nhất câu hỏi ban đầu, mặc dù cuối cùng tôi đã đi một con đường khác (xem câu trả lời của tôi). Cảm ơn.
Kyle Clegg

22

Hãy thử ứng dụng này để chỉ chia sẻ ba ứng dụng - 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);
        }
    }
}

mã này hoạt động hoàn hảo nếu bạn đang cố gắng chia sẻ với các ứng dụng cụ thể
Orcun Sevsay

22

Tìm thấy một giải pháp phù hợp với tôi khi tìm kiếm ở đây (xem bình luận thứ ba về câu trả lời đầu tiên). Mã này tìm kiếm một ứng dụng twitter hợp lệ và sử dụng nó để đăng tweet. Lưu ý: Nó không cung cấp cho bạn Ý định với các ứng dụng khách Twitter khác nhau và cho phép bạn chọn.

Chia sẻ bằng twitter:

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

Gọi phương thức này:

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 sẽ tương tự bằng cách sử dụng " com.facebook.katana ", mặc dù bạn vẫn không thể đặt văn bản tin nhắn (không dùng nữa vào tháng 7 năm 2011).

Nguồn mã: Có ý định mở ứng dụng khách twitter trên Android


4
Tôi không thích câu trả lời này vì nó phụ thuộc vào việc biết tên gói của tất cả các ứng dụng twitter. Để biết cách khác, hãy xem stackoverflow.com/questions/6827407/ trên
Ed Burnette

Tôi đồng ý với bạn, mặc dù câu trả lời bạn liên kết có vấn đề tương tự. Tôi không bao giờ thích dựa vào so sánh chuỗi đặc biệt là khi tôi không kiểm soát hoặc đảm bảo chuỗi sẽ không thay đổi.
Kyle Clegg

11

Cảm ơn @dacoinminster. Tôi thực hiện một số sửa đổi cho câu trả lời của anh ấy bao gồm tên gói của các ứng dụng phổ biến và sắp xếp các ứng dụng đó.

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

Bạn có thể thử mã dưới đây, nó hoạt động hoàn hảo.

Ở đây chúng tôi chia sẻ với một số ứng dụng cụ thể, đó là Facebook, Messenger, Twitter, Google Plus và 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);
        }
    }

lý do cho "if (name.contains (" com.twitter.android.DMActivity ")) {continue;}?
isJulian00

8

Giải pháp này hiển thị danh sách các ứng dụng trong hộp thoại ListView giống với trình chọn:

ảnh chụp màn hình

Tùy thuộc vào bạn:

  1. có được danh sách các gói ứng dụng liên quan
  2. đưa ra một tên gói, gọi ý định có liên quan

Lớp bộ điều hợp:

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

}

và cách sử dụng của nó:

    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

Cách sạch nhất là sao chép các lớp sau: ShareActionProvider, ActivityChooserView, ActivityChooserModel. Thêm khả năng lọc các ý định trong ActivityChooserModel và các phương thức hỗ trợ phù hợp trong ShareActionProvider. Tôi đã tạo các lớp cần thiết, bạn có thể sao chép chúng vào dự án của bạn ( https://gist.github.com/saulpower/10557956 ). Điều này không chỉ thêm khả năng lọc các ứng dụng bạn muốn chia sẻ (nếu bạn biết tên gói) mà còn tắt lịch sử.

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

cách thêm google + và tùy chọn khác có chứa các ứng dụng còn lại
Sunishtha Singh

3

Tôi đã cải thiện câu trả lời @dacoinminster và đây là kết quả với một ví dụ để chia sẻ ứng dụng của bạn:

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

Tôi có cùng một vấn đề và giải pháp được chấp nhận này đã không giúp tôi, nếu ai đó có cùng vấn đề, bạn có thể sử dụng đoạn mã của tôi :

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

Thật đơn giản và súc tích. Cảm ơn nhà phát triển nguồn mở, cketti đã chia sẻ giải pháp này:

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
}

đây là liên kết đến ý chính của anh ấy / cô ấy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.