Soru Android ve Facebook paylaşım amacı


Bir Android uygulaması geliştiriyorum ve Android'in paylaşım hedeflerini kullanarak uygulamanın kullanıcı durumunun uygulama içinden nasıl güncellenebileceğini öğrenmek istiyorum.

Facebook'un SDK'sini incelediğimizde bunun yapılması yeterince kolay görünüyor, ancak kullanıcının normal Share Intent penceresinden yapmasına izin vermeye istekliyim. burada görüldü:

pop up

Her zamanki paylaşım amacı kodunu denedim, ancak bu artık Facebook için işe yaramıyor.

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

GÜNCELLEŞTİRME: Daha fazla kazma yaptıktan sonra, henüz çözülmemiş olan Facebook uygulamasında bir hata gibi görünüyor! (facebook bug) Ortalama zaman için sadece negatif "Sharing çalışmıyor!" yorumlar. Şerefe Facebook: * (


76
2017-09-25 11:37


Menşei


Şimdi bir yıl boyunca birden çok düzeltme ile kırılmıştı, neden düzeltmeyeceklerini anlamıyorum !! - schwiz
Hala kırık. Ben onların aptal facebook sdk kullanmak için bunu düzeltmek değil düşünmeye başlıyorum. - UncleIstvan
Görünüşe göre, Facebook şu anda resmen davranışlarını kırık olarak görmediklerini ve onu değiştirmeyeceğini söyledi: developers.facebook.com/bugs/332619626816423 - Scott W
Yani en azından herhangi bir düzeltme veya geçici çözüm yok mu? Boş mesajla yaşamak zorunda mıyız? : / - Ixx
Maalesef tek çözüm veya geçici çözüm SDK'larını uygulamanıza entegre etmektir. - Joseph Woodward


Cevaplar:


Facebook uygulaması ya EXTRA_SUBJECT veya EXTRA_TEXT alanlar.

İşte hata bağlantısı: https://developers.facebook.com/bugs/332619626816423

Teşekkürler @billynomates:

Şey, bir URL’yi EXTRA_TEXT alan, bu yapar   iş. Sanki herhangi bir metni kasten çıkarmış gibi.


87
2018-01-24 07:53



Şey, EXTRA_TEXT alanına bir URL koyarsanız, yapar iş. Sanki herhangi bir metni bilinçli olarak soymak gibi. - Mike Speed
Bu durumun hala iOS'ta (yazı yazıldığı sırada) çalıştığı, ancak Android'de çalışmadığı gerçekten aptalca. - Peter K.
Paylaşım amacı ile sadece linkler facebook'ta paylaşılabilir. - Misha Akopov
Kullanıcıların içeriği elle yazmaları gerekir: "İleti parametresinin, kullanıcının düzenleyebileceği önerilen içerikle önceden doldurulmasının ayrıca bir politika ihlali olduğunu lütfen unutmayın" youtube.com/watch?v=tGz48L0m5nc - kouretinho
@PeterK. facebook'taki metni yollamak için bir yol buldunuz mu? - Karan Khurana


Görünüşe göre Facebook artık açılmıyorsa (2014 itibariyle) paylaşım ekranını özelleştirmenize izin veriyor. sharer.php URL veya Android amaçlarını daha özel şekillerde kullanma. Örneğin, bu cevaplara bakınız:

Neyse, düz niyetleri kullanarak, sen kutu hala bir URL paylaşır, ancak onunla herhangi bir varsayılan metin paylaşmaz, gibi billynomates yorumladı. (Ayrıca, paylaşılacak bir URL'niz yoksa, boş "Yazma Yaz" (yani durum güncellemesi) iletişim kutusuyla Facebook uygulamasının başlatılması da aynı derecede kolaydır, aşağıdaki kodu kullanın, ancak dışarıda bırakın EXTRA_TEXT.)

İşte bulduğum en iyi çözüm değil Herhangi bir Facebook SDK'sını kullanmayı içerir.

Bu kod resmi Facebook uygulamasını doğrudan açar Yüklü ise ve bir tarayıcıda sharer.php açmaya geri dönerse. (Bu sorudaki diğer çözümlerin çoğu ortaya çıkıyor devasa bir "Komple eylem kullanarak…" iletişim kutusu Bu hiç de optimal değil!)

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

(İlişkin com.facebook.katana paket adı, bkz. MatheusJardimB'nin yorumu.)

Sonuç, Facebook uygulaması yüklü Nexus 7'de (Android 4.4) böyle görünüyor:

enter image description here


104
2018-01-17 15:02



"com.facebook.katana", Facebook uygulaması için paket adıdır ve "com.facebook.orca", FB Messenger uygulaması içindir. İstediğiniz uygun pckg'e değiştirebilirsiniz. Birini belirtmezseniz, ilk bulunan kullanılır (iyi değil) - MatheusJardimB
İyi yakalama, teşekkürler! Cevabı güncelledim. Görünüşe göre Facebook diğer uygulamaları da yayınladıEv ve Sayfa Yöneticisi) aynı zamanda com.facebook önek. - Jonik
Mükemmel cevap - Leo Nguyen
En iyi cevap, teşekkürler! Tarayıcı geri dönüşünü seviyorum. - ilovett
helow ... Eğer edittext yazıyı doldurmak istiyorsanız facebook ile nasıl çalışacağım. - Das


Her zamanki yol

İstediğiniz şeyi oluşturmanın olağan yolu, aşağıdakileri yapmaktır:

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

Bu benim için herhangi bir sorun olmadan çalışır.

Alternatif yol (belki)

Bunu yapmanın olası sorunu, mesajın e-posta, SMS vb. Yoluyla gönderilmesine de izin vermenizdir. Aşağıdaki kod, bir uygulamada kullandığım bir şeydir. Gmail kullanarak Gmail. Sanırım bunu sadece Facebook ile çalışmasını sağlamak için değiştirmeye çalışabilirsin.

Herhangi bir hataya veya istisnaya nasıl yanıt verdiğinden emin değilim (Facebook yüklü değilse bunu tahmin ediyorum), bu yüzden biraz test etmeniz gerekebilir.

    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



Cevabın için teşekkürler. Ancak, yayınladığınız ilk kod parçacığı, paylaşım amacı olan diğer tüm uygulamalara gönderme yapmak için iyi çalışıyor, ancak Facebook'un amacı, boş bir "Yazma" (facebook) sayfasını facebook sayfasına göndermiyormuş gibi gönderiyor ( veya EXTRA_TEXT alanı içindeki metni alabilir. - Joseph Woodward
Hmm, tabletimde ilk olanla gayet iyi çalışıyor. Belirtildiği gibi EXTRA_SUBJECT alanı olmadan deneyin. Bu fark yaratıyor gibi görünüyor. - Michell Bak
Aslında, sadece kontrol ettim ve evet - kırık. Çalışmak için kullanılır. - Michell Bak
Evet, benim düzenlenmiş ilk yazımda da belirtildiği gibi, Nisan 2011'den beri orada olan Facebook uygulamasında bir hata gibi görünüyor (!). Yine de, soruma cevap vermek için zaman ayırdığınız için teşekkür ederim. - Joseph Woodward
@TomSusel Evet, Facebook onların bok birlikte alınmalıdır. Yine de bir URL eklerken çalışır. Downvote için teşekkürler ;-) - Michell Bak


İşte yaptım (metin için). Kodda, panoya gereken herhangi bir metni kopyalarım. Bir kişi paylaşım niyet düğmesini ilk kez kullanmaya çalıştığında, facebook'a paylaşmak isteyip istemediklerini açıklayan bir bildirim açıyorlar, “Facebook” a tıkladıktan sonra yapıştırmak için uzun basmalılar. android niyet sistemi BROKEN vardır). Daha sonra ilgili bilgi alanındadır. Kullanıcıların da şikayet edebilmesi için bu gönderiye bir link ekleyebilirim.

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

Aşağıda, w / önceki sürümleri işlemek için bir yöntem

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





Lollipop'ta (21) kullanabilirsiniz Intent.EXTRA_REPLACEMENT_EXTRAS Özellikle Facebook için amacı geçersiz kılmak (ve sadece bir bağlantı belirtin)

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





Bu çözüm işe yarıyor. Facebook yüklü değilse, normal paylaşım diyaloğunu çalıştırır. Varsa ve giriş yapmadıysanız, giriş ekranına gider. Giriş yaptıysanız, paylaşım iletişim kutusunu açacak ve Niyet Ekstra'dan "URL’yi paylaş" ifadesini ekleyecektir.

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





Sadece paylaşabileceğinizi öğrendim ya Metin  veya  görüntü, her ikisini de kullanma Intents. Yalnızca kod paylaşımlarının altında görüntü Varsa veya sadece Metin Eğer görüntü çıkmıyor. Her ikisini de paylaşmak istiyorsanız, kullanmanız gerekir Facebook SDK buradan.

Kodun altında başka bir çözüm kullanırsanız, paket adını belirtmeyi unutmayın. com.facebook.lite paketin adı da Facebook Lite. Test etmedim ama com.facebook.orca paketin adı Facebook haberci eğer bunu da hedeflemek istiyorsan.

İle paylaşmak için daha fazla yöntem ekleyebilirsiniz. Naber, heyecan ...

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

Almak için Uri File'dan aşağıdaki sınıfı kullanın:

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

Yazmak için FileProvider, bu bağlantıyı kullanın: https://github.com/codepath/android_guides/wiki/Sharing-Content-with-Intents


1
2018-02-24 12:10





İşte ben Facebook Uygulamasını Link ile açtığım bir şey

shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setComponent(new ComponentName("com.facebook.katana",
                    "com.facebook.katana.activity.composer.ImplicitShareIntentHandler"));

shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT,  videoUrl);

0
2017-09-24 10:51



benim için çalışmadı. Muhtemelen Facebook, ImplicitShareIntentHandler adını değiştirdi. - Hesam


    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");    
    shareIntent.putExtra("com.facebook.platform.extra.APPLICATION_ID", activity.getString(R.string.app_id));                        
    activity.startActivity(Intent.createChooser(shareIntent, activity.getString(R.string.share_title)));
}

0
2018-02-01 21:10





Facebook 4.0.0 sürümünde görünüyor, pek çok şey değişti. Bu benim iyi çalışan kodum. Umarım size yardımcı olur.

    /**
     * Facebook does not support sharing content without using their SDK however
     * it is possible to share URL
     *
     * @param content
     * @param url
     */
    private void shareOnFacebook(String content, String url)
    {
        try
        {
            // TODO: This part does not work properly based on my test
            Intent fbIntent = new Intent(Intent.ACTION_SEND);
            fbIntent.setType("text/plain");
            fbIntent.putExtra(Intent.EXTRA_TEXT, content);
            fbIntent.putExtra(Intent.EXTRA_STREAM, url);
            fbIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            fbIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                    | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
            fbIntent.setComponent(new ComponentName("com.facebook.katana",
                    "com.facebook.composer.shareintent.ImplicitShareIntentHandler"));

            startActivity(fbIntent);
            return;
        }
        catch (Exception e)
        {
            // User doesn't have Facebook app installed. Try sharing through browser.
        }

        // If we failed (not native FB app installed), try share through SEND
        String sharerUrl = "https://www.facebook.com/sharer/sharer.php?u=" + url;
        SupportUtils.doShowUri(this.getActivity(), sharerUrl);
    }

0
2018-04-09 03:39



SupportUtils nedir? - Silvia H