सवाल एंड्रॉइड और फेसबुक शेयर इरादा


मैं एक एंड्रॉइड ऐप विकसित कर रहा हूं और यह जानना चाहता हूं कि आप एंड्रॉइड के शेयर इरादों का उपयोग करके ऐप के भीतर ऐप उपयोगकर्ता की स्थिति को कैसे अपडेट कर सकते हैं।

फेसबुक के एसडीके के माध्यम से देखते हुए ऐसा लगता है कि यह करने में काफी आसान है, हालांकि मैं उपयोगकर्ता को नियमित शेयर इरादे पॉप अप विंडो के माध्यम से ऐसा करने की अनुमति देना चाहता हूं? यहां देखा गया:

pop up

मैंने सामान्य शेयर इरादा कोड की कोशिश की है, हालांकि यह अब फेसबुक के लिए काम नहीं कर रहा है।

public void invokeShare(Activity activity, String quote, String credit) {
    Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
    shareIntent.setType("text/plain");
    shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, activity.getString(R.string.share_subject));
    shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Example text");    

    activity.startActivity(Intent.createChooser(shareIntent, activity.getString(R.string.share_title)));
}

अद्यतन करें: अधिक खुदाई करने के बाद, ऐसा लगता है कि यह फेसबुक के ऐप के साथ एक बग है जिसे अभी तक हल नहीं किया गया है! (फेसबुक बग) इस समय के लिए ऐसा लगता है कि मुझे नकारात्मक के साथ आगे बढ़ना होगा "शेयरिंग काम नहीं करता !!!" समीक्षा। चीयर्स फेसबुक: * (


76
2017-09-25 11:37


मूल


कई संशोधनों के साथ अब लगभग एक साल तक टूट गया है, मुझे समझ में नहीं आता कि वे इसे ठीक क्यों नहीं करेंगे !! - schwiz
अभी भी टूटा। मुझे लगता है कि वे इसे अपने बेवकूफ फेसबुक एसडीके का उपयोग करने के उद्देश्य से इसे ठीक नहीं करते हैं। - UncleIstvan
उह, ऐसा प्रतीत होता है कि फेसबुक ने औपचारिक रूप से जवाब दिया है कि वे व्यवहार को तोड़ने पर विचार नहीं करते हैं और इसे बदल नहीं पाएंगे: developers.facebook.com/bugs/332619626816423 - Scott W
तो कम से कम कोई फिक्स या कामकाज नहीं? हमें खाली संदेश के साथ रहना है? : / - Ixx
दुर्भाग्य से एकमात्र फिक्स या वर्कअराउंड अपने एसडीके को अपने ऐप में एकीकृत करना है। - Joseph Woodward


जवाब:


फेसबुक एप्लिकेशन या तो संभाल नहीं करता है EXTRA_SUBJECT या EXTRA_TEXT खेत।

यहां बग लिंक है: https://developers.facebook.com/bugs/332619626816423

धन्यवाद @ बिलीनोमेट्स:

बात यह है कि, यदि आप में एक यूआरएल डालते हैं EXTRA_TEXT क्षेत्र, यह कर देता है   काम। ऐसा लगता है कि वे जानबूझकर किसी भी पाठ को अलग कर रहे हैं।


87
2018-01-24 07:53



बात यह है कि, यदि आप EXTRA_TEXT फ़ील्ड में एक यूआरएल डालते हैं, तो यह कर देता है काम। यह जानबूझकर किसी भी पाठ को अलग करना है। - Mike Speed
यह वास्तव में गूंगा है कि यह अभी भी आईओएस (लेखन के समय) पर काम करता है, लेकिन एंड्रॉइड पर काम नहीं करता है। - Peter K.
शेयर के इरादे से फेसबुक पर केवल लिंक साझा किए जा सकते हैं। - Misha Akopov
उपयोगकर्ताओं को हाथ से सामग्री टाइप करना होगा: "कृपया ध्यान दें कि सुझाए गए सामग्री के साथ संदेश पैरामीटर को भरना जो उपयोगकर्ता संपादित कर सकता है वह नीति उल्लंघन भी है" youtube.com/watch?v=tGz48L0m5nc - kouretinho
@PeterK। क्या आपको फेसबुक पर टेक्स्ट भेजने का कोई तरीका मिला? - Karan Khurana


जाहिर है फेसबुक अब तक नहीं (2014 तक) आपको साझा करने की स्क्रीन को कस्टमाइज़ करने की इजाजत देता है, भले ही आप अभी खुल रहे हों sharer.php यूआरएल या अधिक विशेष तरीकों से एंड्रॉइड इरादों का उपयोग करना। उदाहरण के लिए इन उत्तरों को देखें:

वैसे भी, सादे इरादों का उपयोग करके, आप कर सकते हैं अभी भी एक यूआरएल साझा करें, लेकिन इसके साथ कोई डिफ़ॉल्ट पाठ नहीं है, जैसा बिलीनोमेट्स ने टिप्पणी की। (इसके अलावा, अगर आपके पास साझा करने के लिए कोई यूआरएल नहीं है, तो बस "लिखें पोस्ट" (यानी स्टेटस अपडेट) संवाद के साथ फेसबुक ऐप लॉन्च करना उतना ही आसान है; नीचे दिए गए कोड का उपयोग करें लेकिन छोड़ दें EXTRA_TEXT।)

यहां सबसे अच्छा समाधान है जो मैंने पाया है नहीं किसी भी फेसबुक एसडीके का उपयोग करना शामिल है।

यह कोड सीधे आधिकारिक फेसबुक ऐप खोलता है यदि यह स्थापित है, और अन्यथा ब्राउज़र में sharer.php खोलने के लिए वापस आ जाता है। (इस प्रश्न के अन्य समाधान सामने आते हैं एक विशाल "पूर्ण कार्रवाई ..." संवाद जो बिल्कुल इष्टतम नहीं है!)

String urlToShare = "https://stackoverflow.com/questions/7545254";
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
// intent.putExtra(Intent.EXTRA_SUBJECT, "Foo bar"); // NB: has no effect!
intent.putExtra(Intent.EXTRA_TEXT, urlToShare);

// See if official Facebook app is found
boolean facebookAppFound = false;
List<ResolveInfo> matches = getPackageManager().queryIntentActivities(intent, 0);
for (ResolveInfo info : matches) {
    if (info.activityInfo.packageName.toLowerCase().startsWith("com.facebook.katana")) {
        intent.setPackage(info.activityInfo.packageName);
        facebookAppFound = true;
        break;
    }
}

// As fallback, launch sharer.php in a browser
if (!facebookAppFound) {
    String sharerUrl = "https://www.facebook.com/sharer/sharer.php?u=" + urlToShare;
    intent = new Intent(Intent.ACTION_VIEW, Uri.parse(sharerUrl));
}

startActivity(intent);

(विषय में com.facebook.katana पैकेज का नाम, देखें MatheusJardimB की टिप्पणी।)

इसका परिणाम फेसबुक ऐप इंस्टॉल के साथ मेरे नेक्सस 7 (एंड्रॉइड 4.4) पर दिखता है:

enter image description here


104
2018-01-17 15:02



"com.facebook.katana" फेसबुक ऐप के लिए पैकेज नाम है और "com.facebook.orca" एफबी मैसेंजर ऐप के लिए है। आप इच्छित पीकेजी में बदल सकते हैं। यदि आप एक निर्दिष्ट नहीं करते हैं, तो पहला पाया जाएगा (अच्छा नहीं) - MatheusJardimB
अच्छा पकड़, धन्यवाद! मैंने जवाब अपडेट किया। बाहर निकलता है फेसबुक ने अन्य ऐप्स भी जारी किए हैं (होम तथा पेज प्रबंधक) जो भी मेल खाएगा com.facebook उपसर्ग। - Jonik
उत्कृष्ट जवाब - Leo Nguyen
सबसे अच्छा जवाब, धन्यवाद! ब्राउज़र फॉलबैक प्यार करो। - ilovett
हैलो ... अगर मैं पोस्ट एडिटेक्स्ट भरना चाहता हूं तो फेसबुक के साथ कैसे काम करना है। - Das


सामान्य तरीका

जो भी आप पूछ रहे हैं उसे बनाने का सामान्य तरीका है, बस निम्न कार्य करना है:

    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_TEXT, "The status update text");
    startActivity(Intent.createChooser(intent, "Dialog title text"));

यह मेरे लिए किसी भी मुद्दे के बिना काम करता है।

वैकल्पिक तरीका (शायद)

ऐसा करने में संभावित समस्या यह है कि आप संदेश को ई-मेल, एसएमएस इत्यादि के माध्यम से भेजने की इजाजत दे रहे हैं। निम्नलिखित कोड कुछ ऐसा है जो मैं किसी एप्लिकेशन में उपयोग कर रहा हूं, जो उपयोगकर्ता को मुझे एक ई भेजने की अनुमति देता है जीमेल का उपयोग कर मेल करें। मुझे लगता है कि आप इसे फेसबुक के साथ ही काम करने के लिए इसे बदलने की कोशिश कर सकते हैं।

मुझे यकीन नहीं है कि यह किसी भी त्रुटि या अपवादों का जवाब कैसे देता है (मुझे लगता है कि फेसबुक स्थापित नहीं होने पर यह होगा), तो आपको इसे थोड़ा परीक्षण करना पड़ सकता है।

    try {
        Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
        String[] recipients = new String[]{"e-mail address"};
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, recipients);
        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "E-mail subject");
        emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "E-mail text");
        emailIntent.setType("plain/text"); // This is incorrect MIME, but Gmail is one of the only apps that responds to it - this might need to be replaced with text/plain for Facebook
        final PackageManager pm = getPackageManager();
        final List<ResolveInfo> matches = pm.queryIntentActivities(emailIntent, 0);
        ResolveInfo best = null;
        for (final ResolveInfo info : matches)
            if (info.activityInfo.packageName.endsWith(".gm") ||
                    info.activityInfo.name.toLowerCase().contains("gmail")) best = info;
                if (best != null)
                    emailIntent.setClassName(best.activityInfo.packageName, best.activityInfo.name);
                startActivity(emailIntent);
    } catch (Exception e) {
        Toast.makeText(this, "Application not found", Toast.LENGTH_SHORT).show();
    }

15
2017-09-25 12:47



आपके जवाब के लिए धन्यवाद। यह मुझे भ्रमित करता है, हालांकि आपके द्वारा पोस्ट किए गए कोड का पहला स्निपेट शेयर अन्य उद्देश्यों के साथ हर दूसरे ऐप पर पोस्ट करने के लिए ठीक काम करता है, हालांकि फेसबुक के इरादे से यह उपयोगकर्ता को "कुछ लिखें" फेसबुक पेज को रिक्त स्थान पर ले जाता है जैसे कि यह नहीं भेज रहा है ( या संभवतः प्राप्त करना) EXTRA_TEXT फ़ील्ड के भीतर पाठ। - Joseph Woodward
हम्म, यह मेरे टैबलेट पर पहले के साथ ठीक काम करता है। जैसा कि बताया गया है EXTRA_SUBJECT फ़ील्ड के बिना इसे आज़माएं। ऐसा लगता है कि अंतर बना रहा है। - Michell Bak
असल में, मैंने अभी इसे चेक किया और हाँ - यह टूटा हुआ है। काम करते थे। - Michell Bak
हाँ, जैसा कि मेरे संपादित पहले पोस्ट में उल्लेख किया गया है, यह फेसबुक ऐप में एक बग प्रतीत होता है जो अप्रैल 2011 (!) के बाद से रहा है। भले ही, मेरे प्रश्न का जवाब देने के लिए समय निकालने के लिए धन्यवाद। - Joseph Woodward
@ टॉमसुसल हाँ, फेसबुक को उनके साथ मिलना चाहिए। हालांकि यूआरएल सहित यह काम करता है। डाउनवोट के लिए धन्यवाद ;-) - Michell Bak


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

private void setClipboardText(String text) { // TODO
    int sdk = android.os.Build.VERSION.SDK_INT;
    if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        clipboard.setText(text);
    } else {
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
        android.content.ClipData clip = android.content.ClipData.newPlainText("text label",text);
        clipboard.setPrimaryClip(clip);
    }
}

नीचे w / पूर्व संस्करणों को निपटाने के लिए एक विधि है

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_item_share:
        Intent shareIntent = new Intent(Intent.ACTION_SEND);
        shareIntent.setType("text/plain");
        shareIntent.putExtra(Intent.EXTRA_TEXT, "text here");

        ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); //TODO
         ClipData clip = ClipData.newPlainText("label", "text here");
         clipboard.setPrimaryClip(clip);

        setShareIntent(shareIntent); 

        break;
    }
        return super.onOptionsItemSelected(item);
}

4
2017-10-08 02:14





लॉलीपॉप (21) में, आप इसका उपयोग कर सकते हैं Intent.EXTRA_REPLACEMENT_EXTRAS विशेष रूप से फेसबुक के इरादे को ओवरराइड करने के लिए (और केवल एक लिंक निर्दिष्ट करें)

https://developer.android.com/reference/android/content/Intent.html#EXTRA_REPLACEMENT_EXTRAS

private void doShareLink(String text, String link) {
  Intent shareIntent = new Intent(Intent.ACTION_SEND);
  shareIntent.setType("text/plain");
  Intent chooserIntent = Intent.createChooser(shareIntent, getString(R.string.share_via));

  // for 21+, we can use EXTRA_REPLACEMENT_EXTRAS to support the specific case of Facebook
  // (only supports a link)
  // >=21: facebook=link, other=text+link
  // <=20: all=link
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    shareIntent.putExtra(Intent.EXTRA_TEXT, text + " " + link);
    Bundle facebookBundle = new Bundle();
    facebookBundle.putString(Intent.EXTRA_TEXT, link);
    Bundle replacement = new Bundle();
    replacement.putBundle("com.facebook.katana", facebookBundle);
    chooserIntent.putExtra(Intent.EXTRA_REPLACEMENT_EXTRAS, replacement);
  } else {
    shareIntent.putExtra(Intent.EXTRA_TEXT, link);
  }

  chooserIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(chooserIntent);
}

4
2017-08-15 17:19





यह समाधान भी काम करता है। अगर कोई फेसबुक स्थापित नहीं है, तो यह सामान्य शेयर-संवाद चलाता है। यदि वहां है और आप लॉग इन नहीं हैं, तो यह लॉगिन स्क्रीन पर जाता है। अगर आप लॉग इन हैं, तो यह शेयर संवाद खोल देगा और इरादे अतिरिक्त से "यूआरएल साझा करें" में डाल देगा।

Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, "Share url");
intent.setType("text/plain");

List<ResolveInfo> matches = getMainFragmentActivity().getPackageManager().queryIntentActivities(intent, 0);
for (ResolveInfo info : matches) {
    if (info.activityInfo.packageName.toLowerCase().contains("facebook")) {
        intent.setPackage(info.activityInfo.packageName);
    }
}

startActivity(intent);

1
2017-08-27 09:11





मैंने पाया कि आप केवल साझा कर सकते हैं टेक्स्ट  या  छवि, दोनों का उपयोग नहीं कर रहे हैं Intents। केवल कोड शेयर के नीचे छवि यदि मौजूद है, या केवल टेक्स्ट अगर छवि बाहर नहीं निकलता है यदि आप दोनों को साझा करना चाहते हैं, तो आपको उपयोग करने की आवश्यकता है यहां से फेसबुक एसडीके।

यदि आप नीचे दिए गए कोड के बजाय अन्य समाधान का उपयोग करते हैं, तो पैकेज नाम निर्दिष्ट करना न भूलें com.facebook.lite साथ ही, जो पैकेज का नाम है फेसबुक लाइट। मैंने परीक्षण नहीं किया है लेकिन com.facebook.orca का पैकेज नाम है फेसबुक संदेशवाहक यदि आप इसे भी लक्षित करना चाहते हैं।

आप साझा करने के लिए और अधिक तरीकों को जोड़ सकते हैं WhatsApp, ट्विटर ...

public class IntentShareHelper {

    /**
     * <b>Beware,</b> this shares only image if exists, or only text if image does not exits. Can't share both
     */
    public static void shareOnFacebook(AppCompatActivity appCompatActivity, String textBody, Uri fileUri) {
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("text/plain");
        intent.putExtra(Intent.EXTRA_TEXT,!TextUtils.isEmpty(textBody) ? textBody : "");

        if (fileUri != null) {
            intent.putExtra(Intent.EXTRA_STREAM, fileUri);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setType("image/*");
        }

        boolean facebookAppFound = false;
        List<ResolveInfo> matches = appCompatActivity.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        for (ResolveInfo info : matches) {
            if (info.activityInfo.packageName.toLowerCase().startsWith("com.facebook.katana") ||
                info.activityInfo.packageName.toLowerCase().startsWith("com.facebook.lite")) {
                intent.setPackage(info.activityInfo.packageName);
                facebookAppFound = true;
                break;
            }
        }

        if (facebookAppFound) {
            appCompatActivity.startActivity(intent);
        } else {
            showWarningDialog(appCompatActivity, appCompatActivity.getString(R.string.error_activity_not_found));
        }
    }

    public static void shareOnWhatsapp(AppCompatActivity appCompatActivity, String textBody, Uri fileUri){...}

    private static void showWarningDialog(Context context, String message) {
        new AlertDialog.Builder(context)
                .setMessage(message)
                .setNegativeButton(context.getString(R.string.close), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .setCancelable(true)
                .create().show();
    }
}

पाने के लिए उरी फ़ाइल से, नीचे वर्ग का उपयोग करें:

public class UtilityFile {
    public static @Nullable Uri getUriFromFile(Context context, @Nullable File file) {
        if (file == null)
            return null;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            try {
                return FileProvider.getUriForFile(context, "com.my.package.fileprovider", file);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        } else {
            return Uri.fromFile(file);
        }
    }

    // Returns the URI path to the Bitmap displayed in specified ImageView       
    public static Uri getLocalBitmapUri(Context context, ImageView imageView) {
        Drawable drawable = imageView.getDrawable();
        Bitmap bmp = null;
        if (drawable instanceof BitmapDrawable) {
            bmp = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
        } else {
            return null;
        }
        // Store image to default external storage directory
        Uri bmpUri = null;
        try {
            // Use methods on Context to access package-specific directories on external storage.
            // This way, you don't need to request external read/write permission.
            File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "share_image_" + System.currentTimeMillis() + ".png");
            FileOutputStream out = new FileOutputStream(file);
            bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.close();

            bmpUri = getUriFromFile(context, file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bmpUri;
    }    
}

लिखने के लिये FileProvider, इस लिंक का उपयोग करें: https://github.com/codepath/android_guides/wiki/Sharing-Content-with-Intents


1
2018-02-24 12:10