ACTION_SEND অভিপ্রায় জন্য নির্দিষ্ট অ্যাপ্লিকেশনগুলিকে কীভাবে ফিল্টার করবেন (এবং প্রতিটি অ্যাপ্লিকেশনের জন্য একটি পৃথক পাঠ্য সেট করুন)


187

ACTION_SEND অভিপ্রায়টি ব্যবহার করার সময় আপনি কীভাবে নির্দিষ্ট অ্যাপ্লিকেশনগুলি ফিল্টার করতে পারেন? এই প্রশ্নটি বিভিন্ন উপায়ে জিজ্ঞাসা করা হয়েছে, তবে আমি প্রদত্ত উত্তরের ভিত্তিতে কোনও সমাধান সংগ্রহ করতে পারিনি। আশা করি কেউ সাহায্য করতে পারেন। আমি একটি অ্যাপ্লিকেশন মধ্যে ভাগ করার ক্ষমতা প্রদান করতে চাই। অ্যান্ড্রয়েড দেব আলেকজান্ডার লুকাসের পরামর্শ অনুসরণ করে আমি এটি ব্যবহার করতে পছন্দ করব এবং ফেসবুক / টুইটার এপিআই ব্যবহার না করাই।

ACTION_SEND অভিপ্রায় ব্যবহার করে ভাগ করা হচ্ছে

ACTION_SEND অভিপ্রায়টি ব্যবহার করে ভাগ করে নেওয়া দুর্দান্ত তবে সমস্যাটি হল (1) আমি সেখানে প্রতিটি ভাগ করে নেওয়ার বিকল্প চাই না, বরং আমি এটিকে এফবি, টুইটার এবং ইমেলের মধ্যে সীমাবদ্ধ করব এবং (২) আমি ভাগ করতে চাই না প্রতিটি ভাগ করে নেওয়ার অ্যাপ্লিকেশনটিতে একই জিনিস । উদাহরণস্বরূপ, আমার টুইটার শেয়ারে আমি কিছু উল্লেখ এবং হ্যাশট্যাগগুলি এটি 140 টি অক্ষর বা তার চেয়ে কম সীমাবদ্ধ করতে যাচ্ছি, যখন ফেসবুক শেয়ারটি একটি লিঙ্ক এবং একটি বৈশিষ্ট্য চিত্র অন্তর্ভুক্ত করতে চলেছে।

ACTION_SEND (ভাগ) অভিপ্রায় জন্য বিকল্পগুলি সীমাবদ্ধ করা সম্ভব? আমি প্যাকেজম্যানেজার এবং ক্যোয়ারিআইন্ট্যান্ট অ্যাক্টিভিটিস ব্যবহার সম্পর্কে কিছু দেখেছি, তবে প্যাকেজম্যানেজার এবং অ্যাকশন_এসইএনডি অভিপ্রায়ের মধ্যে সংযোগটি বের করতে সক্ষম হয়েছি।

অথবা

ভাগ করে নেওয়ার অ্যাপ্লিকেশনগুলি ফিল্টার করার পরিবর্তে, আমি ডায়লগটি পপ করার পরিবর্তে সরাসরি ফেসবুক বা টুইটারে যাওয়ার জন্য ACTION_SEND অভিপ্রায়টি ব্যবহার করতে পারলে আমার সমস্যাও সমাধান হতে পারে। যদি তা হয় তবে আমি নিজের ডায়ালগ তৈরি করতে পারতাম এবং যখন তারা "ফেসবুক" ক্লিক করে একটি ফেসবুক-নির্দিষ্ট অভিপ্রায় তৈরি করে এবং কেবল তাদের সমস্ত উপায় ফেসবুকে প্রেরণ করে। টুইটারেও একই রকম।

নাকি এটা সম্ভব নয়? ফেসবুক এবং টুইটারের এপিআইগুলি কি একমাত্র উপায়?


সম্ভাব্য অনুরূপ: [অর্ডারি ফিল্টারিং-এর অভিপ্রায়-চয়নকারী ভিত্তিক অন-ইনস্টল করা-অ্যান্ড্রয়েড-প্যাকেজ-নাম] [1] [1]: stackoverflow.com/questions/5734678/...
আসফ Pinhassi

1
এই ব্লগপোস্টটি সঠিক উত্তর বলে মনে হচ্ছে: hkdevtips.blogspot.com/2013/02/…
ভিতালি

2
আরে বন্ধু ... আমি যখন আমার প্রেরণ বোতামটি ক্লিক করি তখন শেয়ার ডায়লগ খুলুন এবং ডায়ালগের তালিকাটি হ'ল "জিমেইল, ইমেল, জাপিয়া, হুকআপ" ইত্যাদি তবে ফেসবুক, হোয়াটসঅ্যাপ, ফেসবুক মেসেঞ্জার, হাইগআউটস দেখানো হচ্ছে না ... আমি কীভাবে এটি প্রদর্শন করতে পারি ??
জিবি_ভায়ানী

অ্যান্ড্রয়েড 6.০-তে যখন কেবলমাত্র একটি আইটেম / ইন্টেন্ট অ্যাকশনের বিকল্প রয়েছে তখন কীভাবে চয়নকারীকে না দেখানো যায়? সমস্যাটি অ্যান্ড্রয়েড 6.0 এর চেয়ে কম প্রদর্শিত হবে না
zys

উত্তর:


324

আমার জানা মতে, স্ট্যাকওভারফ্লোতে প্রচুর লোক এই প্রশ্নটি বিভিন্ন উপায়ে জিজ্ঞাসা করেছেন, তবে এখনও কেউই এর পুরোপুরি উত্তর দেয়নি।

আমার স্পেক ব্যবহারকারীকে প্রত্যেকের জন্য কাস্টম পাঠ্য সহ ইমেল, টুইটার, ফেসবুক, বা এসএমএস চয়ন করতে সক্ষম হওয়ার আহ্বান জানিয়েছে। এখানে আমি কীভাবে এটি সম্পাদন করেছি:

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প্লেইন-পাঠ্যের ধরণের জেনেরিকের কাছ থেকে নিতে চাই এবং চয়নকারীকে দেখানোর আগে সেগুলি টেক করি।

আমি যখন অতিরিক্ত উদ্দেশ্যগুলি দখল করি, আমি প্রত্যেকটির জন্য কাস্টম পাঠ্য সেট করি।

সম্পাদনা 2: আমি এটি পোস্ট করার পরে কিছুক্ষণ হয়েছে, এবং কিছুটা পরিবর্তন হয়েছে। বিকল্পগুলির তালিকায় আপনি যদি দু'বার জিমেইলটি দেখতে পান তবে নীচে @h_k এর মন্তব্যে প্রস্তাবিত "android.gm" এর জন্য বিশেষ হ্যান্ডলিংটি সরানোর চেষ্টা করুন।

যেহেতু এটির একটি উত্তর আমার প্রায় সমস্ত স্ট্যাকওভারফ্লো খ্যাতি পয়েন্টগুলির উত্স, তাই আমি কমপক্ষে এটি আপ টু ডেট রাখার চেষ্টা করতে হবে।


1
আমি এই কোডটি ব্যবহার করছি, তবে কোনওভাবে evernote তালিকার মধ্যে স্নেহ করছে। আমি যখন প্যাকেজের নামগুলি পরীক্ষা করি, তখন এটি com.evernote হয়, তাই কেন এটি ঘটছে তা আমি নিশ্চিত নই।
জেমস হার্প

1
@ ব্যবহারকারীর ২৪৪৯২7 I'd আমি আপনাকে মেসেজিং অ্যাপটি এড়িয়ে যাচ্ছেন যতক্ষণ না কোডের মধ্য দিয়ে পদক্ষেপ নেওয়ার পরামর্শ দিচ্ছি, তারপরে সেই অ্যাপ্লিকেশনটি শ্বেত তালিকাতে আপনাকে কী স্ট্রিং যুক্ত করতে হবে তা নির্ধারণ করতে প্যাকেজটির নামটি দেখুন।
ডাকসোমিনস্টার

1
@ গিলবাউ হাই! দুঃখিত - আমি এই কোডটি দেখে অনেক দিন হয়ে গেছে। । । আমার স্মরণ হিসাবে, সেটপ্যাকেজ কমান্ডটি একক উদ্দেশ্যটি বেছে নিয়েছে যা আপনি অন্য সমস্ত কিছু সংযোজন করবেন। অন্যান্য বিভিন্ন অভিপ্রায় অন্তর্ভুক্ত বা বাদ দেওয়ার জন্য, আমি কোডটি দিয়ে পদক্ষেপ নেওয়ার এবং প্যাকেজের নামগুলি দেখার পরামর্শ দিচ্ছি।
ডাকোইমিনস্টার

2
কেবলমাত্র ইমেল অ্যাপ্লিকেশনগুলির জন্য ফিল্টার করতে ব্যবহারকারীর কাছে আপনি এই প্রশ্নটি থেকে দ্বিতীয় উত্তরটি ব্যবহার করতে পারেন: stackoverflow.com/questions/8701634/send-email-intent । এটিতে ডেটা ধরণের বার্তা / rfc822 ব্যবহার করার প্রয়োজন নেই যা অন্যান্য অ্যাপস যেমন এভারনোট এ ক্ষেত্রেও ব্যবহার করে।
mpellegr

2
টুইটার এবং হোয়াটসঅ্যাপের মতো অ্যাপ্লিকেশনগুলির জন্য আমাকে বিভিন্ন টেক্সট সংজ্ঞায়িত করার জন্য আপনার ডকুমিনমিস্টর আপনার কোডটি দুর্দান্ত esome সদৃশ জিমেইলটি সরাতে আমি সমীকরণটির বাইরে "android.gm" নিয়েছি। আমি এখনও চয়নকারী তালিকায় জিমেইল এবং অন্তর্নির্মিত মেল অ্যাপটি পাই এবং বিষয় এবং পাঠ্য এখনও অক্ষত।
h_k

26

আপনি যদি একটি কাস্টমাইজড বিকল্প চান তবে আপনার এই ক্রিয়াকলাপের জন্য অ্যান্ড্রয়েড সরবরাহ করা ডিফল্ট কথোপকথনের উপর নির্ভর করা উচিত নয়।

পরিবর্তে আপনাকে যা করতে হবে তা হ'ল আপনার নিজস্ব রোল আউট। আপনাকে প্যাকেজম্যানেজারটি জিজ্ঞাসা করতে হবে হবে যে প্যাকেজগুলি আপনার প্রয়োজনীয় ক্রিয়া পরিচালনা করে এবং তারপরে উত্তরের ভিত্তিতে আপনি ফিল্টারিং এবং কাস্টমাইজড পাঠ্য প্রয়োগ করেন।

বিশেষত, প্যাকেজম্যানেজারের পদ্ধতি ক্রিয়াকলাপের উদ্দেশ্যসমূহের দিকে একবার নজর দিন বর্গ। আপনি এই অভিপ্রায়টি তৈরি করেন যা ডিফল্ট ডায়ালগটি চালু করবে (ACTION_SEND অভিপ্রায়), এই পদ্ধতিতে এটি পাস করুন এবং আপনি সেই বস্তুগুলির একটি তালিকা পাবেন যা ক্রিয়াকলাপের উপর তথ্য অন্তর্ভুক্ত করে যা সেই উদ্দেশ্যটি পরিচালনা করতে পারে। এটি ব্যবহার করে আপনি নিজের পছন্দগুলি চয়ন করতে পারেন।

আপনি যে প্যাকেজগুলি উপস্থাপন করতে চান তার তালিকা তৈরি করার পরে আপনাকে নিজের তালিকা ডায়ালগ তৈরি করতে হবে (ডায়ালগ থিম সহ একটি ক্রিয়াকলাপ) যা সেই তালিকাটি প্রদর্শন করবে।

তবে একটি বিষয় লক্ষণীয় যে কাস্টম ডায়লগটি ডিফল্টর মতো করা খুব শক্ত। সমস্যাটি হ'ল সেই কথোপকথনে ব্যবহৃত থিমটি একটি অভ্যন্তরীণ থিম এবং আপনার অ্যাপ্লিকেশন ব্যবহার করতে পারে না। আপনি হয় এটিকে নিজের ইচ্ছা মতোই তৈরি করার চেষ্টা করতে পারেন বা সম্পূর্ণ কাস্টম বর্ণনার জন্য যেতে পারেন (অনেক অ্যাপ্লিকেশন সেগুলি গ্যালারী অ্যাপ্লিকেশন ইত্যাদির মতো করে)


1
এই উত্তরটি সঠিক হিসাবে চিহ্নিত করা হচ্ছে কারণ এটি সবচেয়ে গুরুত্বপূর্ণভাবে মূল প্রশ্নের উত্তর দেয়, যদিও আমি অন্য পথে যেতে শেষ করেছিলাম (আমার উত্তর দেখুন)। ধন্যবাদ।
কাইল Clegg

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

আপনি যদি নির্দিষ্ট অ্যাপ্লিকেশনগুলির সাথে ভাগ করে নেওয়ার চেষ্টা করছেন তবে এই কোডটি পুরোপুরি কাজ করে
অরকুন সেভসে

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 " ব্যবহার করে ফেসবুকটি একই রকম হবে , যদিও আপনি এখনও বার্তা পাঠ্য সেট করতে পারবেন না (জুলাই ২০১১ অবমূল্যায়ন )।

কোড উত্স: অ্যান্ড্রয়েডে টুইটার ক্লায়েন্ট খোলার ইচ্ছাকৃত


4
আমি এই উত্তরটি পছন্দ করি না কারণ এটি সমস্ত টুইটার অ্যাপসের প্যাকেজের নাম জানার উপর নির্ভর করে। অন্য কোনও উপায়ে দেখুন stackoverflow.com/questions/6827407/…
এড বার্নেট

আমি আপনার সাথে একমত, যদিও আপনি যে উত্তরটির সাথে উত্তর দিয়েছেন তার একই ধরণের সমস্যা রয়েছে। আমি স্ট্রিং তুলনার উপর নির্ভর করতে পছন্দ করি না বিশেষত যখন আমার কোনও নিয়ন্ত্রণ না থাকে বা গ্যারান্টি থাকে যে স্ট্রিংটি পরিবর্তন হবে না।
কাইল Clegg

11

@ ড্যাকোইনমিনস্টারকে ধন্যবাদ। জনপ্রিয় অ্যাপগুলির প্যাকেজের নাম এবং সেই অ্যাপ্লিকেশনগুলির বাছাই সহ আমি তার উত্তরে কিছু পরিবর্তন করেছি।

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

আপনি নীচের কোডটি চেষ্টা করতে পারেন, এটি পুরোপুরি কার্যকর করে।

এখানে আমরা কয়েকটি নির্দিষ্ট অ্যাপ্লিকেশনগুলিতে ভাগ করি, তা হ'ল ফেসবুক, মেসেঞ্জার, টুইটার, গুগল প্লাস এবং জিমেইল।

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 ")) এর কারণ কী is অব্যাহত;}?
জুলিয়ান00

8

এই দ্রষ্টব্যটি তালিকাগুলির ডায়ালগটিতে অ্যাপ্লিকেশনগুলির একটি তালিকা প্রদর্শন করে যা চয়নকারীর অনুরূপ:

স্ক্রিনশট

এটি আপনার উপর নির্ভর করে:

  1. সম্পর্কিত অ্যাপ্লিকেশন প্যাকেজগুলির তালিকা প্রাপ্ত করুন obtain
  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

সবচেয়ে পরিষ্কার উপায় হল নিম্নলিখিত ক্লাসগুলি অনুলিপি করা: শেয়ারঅ্যাকশনপ্রোভাডার, অ্যাক্টিভিটিচুসারভিউ, অ্যাক্টিভিটিচুসারমোডেল। অ্যাক্টিভিটিচুসারমোডেলে এবং শেয়ারঅ্যাকশনপ্রোভাইডারটিতে উপযুক্ত সমর্থন পদ্ধতিগুলিতে ইন্টেন্টগুলি ফিল্টার করার ক্ষমতা যুক্ত করুন। আমি প্রয়োজনীয় ক্লাস তৈরি করেছি, আপনি এগুলি আপনার প্রকল্পে অনুলিপি করতে পারেন ( 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);
}

গুগল + এবং অন্যান্য বিকল্প যা কীভাবে অবশিষ্ট অ্যাপ্লিকেশন রয়েছে সেগুলি যুক্ত করবেন
সুনিষ্ঠা সিং

3

আমি @ ড্যাকোইনমিনস্টার উত্তরের উন্নতি করেছি এবং এটি আপনার অ্যাপ্লিকেশন ভাগ করে নেওয়ার উদাহরণ সহ ফলাফল:

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

এত সহজ এবং সংক্ষিপ্ত। মুক্ত সমাধান বিকাশকারীকে ধন্যবাদ, এই সমাধানটি ভাগ করে নেওয়ার জন্য কেকেটি :

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
}

এবং এটি তার / তার সংক্ষেপের লিঙ্ক।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.