ACTION_SEND इरादे के लिए विशिष्ट एप्लिकेशन कैसे फ़िल्टर करें (और प्रत्येक ऐप के लिए एक अलग पाठ सेट करें)


187

ACTION_SEND आशय का उपयोग करते समय आप विशिष्ट एप्लिकेशन को कैसे फ़िल्टर कर सकते हैं? यह प्रश्न विभिन्न तरीकों से पूछा गया है, लेकिन मैं दिए गए उत्तरों के आधार पर समाधान नहीं जुटा पाया। उम्मीद है कि कोई मदद कर सकता है। मैं एक ऐप के भीतर साझा करने की क्षमता प्रदान करना चाहूंगा। बाद Android Dev अलेक्जेंडर लुकास की सलाह है, मैं यह उद्देश्य का उपयोग करने और नहीं फेसबुक / ट्विटर एपीआई का उपयोग कर ऐसा करने के लिए पसंद करेंगे।

ACTION_SEND इरादे का उपयोग करके साझा करना

ACTION_SEND इरादे का उपयोग करना साझा करना बहुत अच्छा है, लेकिन समस्या यह है (1) मुझे वहां हर साझाकरण विकल्प नहीं चाहिए, मैं इसे FB, Twitter और ईमेल तक सीमित कर दूंगा और (2) मैं साझा नहीं करना चाहता प्रत्येक साझाकरण ऐप के लिए एक ही बात । उदाहरण के लिए, अपने ट्विटर शेयर में मैं कुछ उल्लेखों को शामिल करने जा रहा हूं और हैशटैग इसे 140 चार्ट या उससे कम पर सीमित कर रहा है, जबकि फेसबुक शेयर में एक लिंक और एक फीचर इमेज शामिल है।

क्या ACTION_SEND (शेयर) इरादे के विकल्पों को सीमित करना संभव है? मैंने PackageManager और queryIntentActivities का उपयोग करने के बारे में कुछ देखा है, लेकिन PackageManager और ACTION_SEND इरादे के बीच संबंध का पता लगाने में सक्षम नहीं है।

या

साझाकरण ऐप्स को फ़िल्टर करने के बजाय, मेरी समस्या का समाधान भी किया जा सकता है अगर मैं संवाद को पॉप अप करने के बजाय सीधे फेसबुक या ट्विटर पर जाने के लिए ACTION_SEND इरादे का उपयोग कर सकता हूं। यदि ऐसा होता तो मैं अपना स्वयं का संवाद बना सकता था और जब वे "फेसबुक" पर क्लिक करते हैं तो एक फेसबुक-विशिष्ट इरादे का निर्माण करते हैं और उन्हें फेसबुक पर भेजते हैं। ट्विटर के साथ भी।

या यह संभव नहीं है? क्या फेसबुक और ट्विटर एपीआई एकमात्र रास्ता हैं?


संभावित डुप्लिकेट: [कस्टम-फ़िल्टरिंग-ऑफ-
इंटेंशन-चॉसर

1
इस ब्लॉगपोस्ट का सटीक उत्तर प्रतीत होता है: hkdevtips.blogspot.com/2013/02/…
विटाली

2
हे मित्र ... जब मैं अपना सेंड बटन क्लिक करता हूं तो ओपन डायलॉग डायलॉग और शेयर डायलॉग लिस्ट "gmail, ईमेल, zapiya, हुकिंग" आदि है। लेकिन फेसबुक, व्हाट्सएप, फेसबुक मैसेंजर, हाइक हैंगआउट नहीं दिखा रहा है ... मैं इसे कैसे दिखा सकता हूं ??
GB_Bhayani

एंड्रॉइड 6.0 पर इरादे की कार्रवाई का केवल एक आइटम / विकल्प होने पर चयनकर्ता को कैसे नहीं दिखाया जाए? समस्या एंड्रॉइड 6.0
zys

जवाबों:


324

मेरी जानकारी के लिए, StackOverflow में बहुत से लोग इस सवाल को विभिन्न तरीकों से पूछ रहे हैं, लेकिन किसी ने भी इसका पूरी तरह से जवाब नहीं दिया है।

मेरे युक्ति ने उपयोगकर्ता को हर एक के लिए कस्टम पाठ के साथ ईमेल, ट्विटर, फेसबुक या एसएमएस चुनने में सक्षम होने के लिए बुलाया। यहाँ है कि मैं कैसे पूरा किया:

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

मुझे यह पता चला कि विभिन्न स्थानों पर इसे कैसे किया जाता है, लेकिन मैंने यह सब कहीं और नहीं देखा है।

ध्यान दें कि यह विधि उन सभी मूर्खतापूर्ण विकल्पों को भी छिपाती है जो मुझे नहीं चाहिए, जैसे कि वाईफाई और ब्लूटूथ पर साझा करना।

आशा है कि यह किसी की मदद करता है।

संपादित करें: एक टिप्पणी में, मुझे यह समझाने के लिए कहा गया था कि यह कोड क्या कर रहा है। मूल रूप से, यह ACTION_SENDकेवल मूल ईमेल क्लाइंट के लिए एक इरादा पैदा कर रहा है, फिर चयनकर्ता पर अन्य इरादों से निपटना। मूल इरादे को ईमेल-विशिष्ट बनाने से वाईफाई और ब्लूटूथ जैसे सभी अतिरिक्त कबाड़ से छुटकारा मिल जाता है, फिर मैं अन्य इरादों को पकड़ता हूं जो मैं ACTION_SENDटाइप-टेक्स्ट के जेनेरिक से चाहता हूं , और चयनकर्ता को दिखाने से पहले उनसे निपटता हूं।

जब मैं अतिरिक्त इरादों को पकड़ लेता हूं, तो मैं प्रत्येक के लिए कस्टम पाठ सेट करता हूं।

Edit2: जब से मैंने इसे पोस्ट किया है, कुछ समय हो गया है और चीजें थोड़ी बदल गई हैं। यदि आप विकल्पों की सूची में दो बार जीमेल देख रहे हैं, तो "android.gm" के लिए विशेष हैंडलिंग को हटाने का प्रयास करें जैसा कि नीचे @h_k द्वारा एक टिप्पणी में दिया गया है।

चूँकि यह एक उत्तर लगभग मेरे सभी स्टैकओवरफ़्लो प्रतिष्ठा बिंदुओं का स्रोत है, इसलिए मुझे कम से कम इसे अद्यतन रखने की कोशिश करनी होगी।


1
मैं इस कोड का उपयोग कर रहा हूं, लेकिन किसी भी तरह कभी भी सूची में घुस रहा है। जब मैं पैकेज के नामों की जांच करता हूं, तो यह com.evernote है, इसलिए मुझे यकीन नहीं है कि ऐसा क्यों हो रहा है।
जेम्स हार्प

1
@ user2249287 आप कोड के माध्यम से आपको सुझाव देंगे कि जब तक आप मैसेजिंग ऐप को नहीं छोड़ते हैं, तब तक पैक करने के लिए पैक करने वाले को देख लें कि आपको उस एप को श्वेतसूची में जोड़ने की क्या आवश्यकता है।
डेकोइनमिन्स्टर

1
@ गिल्बो हाय! क्षमा करें - इस कोड को देखे हुए मुझे बहुत समय हो गया है। । । जैसा कि मुझे याद है, setPackage कमांड एकल इरादे को चुनती है जिसे आप बाकी सब कुछ के लिए जोड़ देंगे। विभिन्न अन्य इरादों को शामिल करने या बाहर करने के लिए, मैं कोड के माध्यम से कदम रखने और पैकेज नामों को देखने की सलाह देता हूं।
dacoinminster

2
उपयोगकर्ता के पास केवल ईमेल ऐप्स के लिए फ़िल्टर करने के लिए आपके पास इस प्रश्न के दूसरे उत्तर का उपयोग कर सकते हैं: stackoverflow.com/questions/8701634/send-email-intent । यह एक डेटा प्रकार के संदेश / rfc822 का उपयोग करने की आवश्यकता नहीं है, जो इस मामले में EverNote जैसे अन्य एप्लिकेशन भी उपयोग करते हैं।
mpellegr

2
@dacoinminster ट्विटर और व्हाट्सएप जैसे ऐप के लिए अलग-अलग टेक्स्ट को परिभाषित करने की अनुमति देने के लिए आपका कोड बहुत बढ़िया रहा है। डुप्लिकेट जीमेल को हटाने के लिए, मैंने समीकरण से "android.gm" लिया। मुझे अभी भी जीमेल मिलता है और चयनकर्ता सूची में अंतर्निहित मेल ऐप और विषय और पाठ अभी भी बरकरार हैं।
h_k

26

यदि आप एक अनुकूलित विकल्प चाहते हैं तो आपको इस क्रिया के लिए Android द्वारा प्रदान किए गए डिफ़ॉल्ट संवाद पर भरोसा नहीं करना चाहिए।

इसके बजाय आपको क्या करने की आवश्यकता है, अपना रोल आउट करें। आपको पैकेज मैनजर को क्वेरी करने की आवश्यकता होगी, जिस पर संकुल को आपके द्वारा आवश्यक कार्रवाई को संभालना है और फिर उत्तर के आधार पर, आप फ़िल्टरिंग और अनुकूलित पाठ लागू करते हैं।

विशेष रूप से, विधि पर एक नज़र डालें queryIntentActivities की PackageManager वर्ग। आप उस इरादे का निर्माण करते हैं जो डिफ़ॉल्ट संवाद (ACTION_SEND इरादे) को लॉन्च करेगा, इस विधि को पास करें और आपको उन वस्तुओं की एक सूची प्राप्त होगी जिसमें उन गतिविधियों पर जानकारी शामिल है जो उस इरादे को संभाल सकती हैं। इसका उपयोग करके, आप उन लोगों को चुन सकते हैं जिन्हें आप चाहते हैं।

एक बार जब आप अपने द्वारा प्रस्तुत किए जाने वाले पैकेजों की अपनी सूची बना लेते हैं, तो आपको अपनी खुद की सूची संवाद (अधिमानतः संवाद विषय के साथ एक गतिविधि) बनाने की आवश्यकता होती है जो उस सूची को प्रदर्शित करेगी।

एक बात ध्यान देने योग्य है कि यह है कि कस्टम डायलॉग को डिफ़ॉल्ट की तरह बनाना बहुत कठिन है। समस्या यह है कि उस संवाद में प्रयुक्त विषय एक आंतरिक विषय है और इसका उपयोग आपके एप्लिकेशन द्वारा नहीं किया जा सकता है। आप या तो इसे मूल निवासी के समान बनाने की कोशिश कर सकते हैं जैसा आप चाहते हैं या पूरी तरह से कस्टम लुक के लिए जा सकते हैं (कई ऐप ऐसा करते हैं जैसे गैलरी उपकरण आदि)


1
इस उत्तर को सही तरीके से चिह्नित करने के बाद से यह सबसे मूल प्रश्न का उत्तर देता है, भले ही मैंने एक अलग मार्ग समाप्त कर दिया (मेरा उत्तर देखें)। धन्यवाद।
काइल क्लेग

22

केवल तीन ऐप्स-फेसबुक, ट्विटर, काकाओस्टोररी साझा करने के लिए इसे आज़माएं।

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

यह कोड पूरी तरह से काम करता है यदि आप विशिष्ट एप्लिकेशन के साथ साझा करने का प्रयास कर रहे हैं
Orcun Sevsay

22

एक समाधान मिला जो मेरे लिए यहाँ काम कर रहा है (पहले उत्तर पर तीसरी टिप्पणी देखें)। यह कोड एक वैध ट्विटर क्लाइंट के लिए दिखता है और ट्वीट को पोस्ट करने के लिए इसका उपयोग करता है। नोट: यह आपको विभिन्न ट्विटर क्लाइंट के साथ एक आशय नहीं देता है और आपको चुनने की अनुमति देता है।

ट्विटर का उपयोग कर साझा करें:

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

इस विधि को कॉल करना:

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

फेसबुक " com.facebook.katana " का उपयोग करने के समान होगा , हालांकि आप अभी भी संदेश पाठ सेट नहीं कर सकते हैं (जुलाई 2011 में पदावनत)।

कोड स्रोत: Android पर ट्विटर क्लाइंट खोलने का इरादा है


4
मुझे यह उत्तर पसंद नहीं है क्योंकि यह सभी ट्विटर ऐप्स के पैकेज नामों को जानने पर निर्भर करता है। दूसरे तरीके के लिए देखें stackoverflow.com/questions/6827407/…
Ed Burnette

मैं आपसे सहमत हूँ, हालाँकि आपने जो उत्तर दिया है वह इसी तरह की समस्या है। मुझे स्ट्रिंग तुलनाओं पर भरोसा करना कभी पसंद नहीं है, खासकर जब मेरे पास कोई नियंत्रण नहीं है या गारंटी नहीं है कि स्ट्रिंग नहीं बदलेगी।
काइल क्लेग

11

@Dacoinminster को धन्यवाद। मैं उनके जवाब के लिए कुछ संशोधन करता हूं, जिसमें लोकप्रिय ऐप्स के पैकेज के नाम और उन ऐप्स को सॉर्ट करना शामिल है।

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

आप नीचे दिए गए कोड की कोशिश कर सकते हैं, यह पूरी तरह से काम करता है।

यहां हम कुछ विशिष्ट ऐप्स को साझा करते हैं, जो फेसबुक, मैसेंजर, ट्विटर, Google प्लस और जीमेल हैं।

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 ")) {जारी रखें?} के लिए क्या कारण है?
isJulian00

8

यह समाधान सूची दृश्य में उन अनुप्रयोगों की सूची दिखाता है जो चयनकर्ता से मिलते जुलते हैं:

स्क्रीनशॉट

यह आप पर निर्भर है:

  1. प्रासंगिक एप्लिकेशन पैकेजों की सूची प्राप्त करें
  2. एक पैकेज का नाम दिया, प्रासंगिक इरादे का आह्वान किया

एडॉप्टर क्लास:

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

}

और इसका उपयोग:

    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

सबसे साफ तरीका निम्न वर्गों को कॉपी करना है: ShareActionProvider, ActivityChooserView, ActivChooserMinel। ActivChooserModel में इंटेंट को फ़िल्टर करने की क्षमता और ShareActionProvider में उपयुक्त समर्थन विधियों को जोड़ें। मैंने आवश्यक कक्षाएं बनाईं, आप उन्हें अपने प्रोजेक्ट ( https://gist.github.com/saulpower/10557956 ) में कॉपी कर सकते हैं । यह न केवल उन ऐप्स को फ़िल्टर करने की क्षमता जोड़ता है जिन्हें आप (यदि आप पैकेज का नाम जानते हैं) साझा करना चाहते हैं, लेकिन इतिहास को बंद करने के लिए भी।

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 + और अन्य विकल्प कैसे जोड़े जा सकते हैं जिसमें
रीमेक

3

मैंने @dacoinminster उत्तर में सुधार किया है और यह आपके ऐप को साझा करने के लिए एक उदाहरण के साथ परिणाम है:

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

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

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

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

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

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

context.startActivity(Intent.createChooser(emailIntent, resources.getString(R.string.compartirEn)).putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray(new LabeledIntent[intentList.size()])));

3

मेरे पास एक ही समस्या थी और इस स्वीकृत समाधान ने मेरी मदद नहीं की, अगर किसी को एक ही समस्या है तो आप मेरे कोड स्निपेट का उपयोग कर सकते हैं :

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

इतना सरल और संक्षिप्त। ओपन सोर्स डेवलपर के लिए धन्यवाद, इस समाधान को साझा करने के लिए 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
}

और यह उसकी / उसके लिंग के लिए लिंक है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.