Android ve Facebook paylaşım amacı


85

Bir Android uygulaması geliştiriyorum ve uygulama kullanıcısının durumunu Android'in paylaşım amaçlarını kullanarak uygulama içinden nasıl güncelleyebileceğinizi öğrenmekle ilgileniyorum.

Facebook'un SDK'sına baktıktan sonra, bunu yapmak yeterince kolay görünüyor, ancak kullanıcının bunu normal Paylaşım Amacı açılır penceresi aracılığıyla yapmasına izin vermek istiyorum. burada görüldü:

açılır

Her zamanki paylaşım amacı kodunu denedim, ancak bu artık Facebook için çalışmıyor gibi görünü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ÜNCELLEME: Daha fazla araştırma yaptıktan sonra, Facebook uygulamasında henüz çözülmemiş bir hata gibi görünüyor! ( facebook hatası ) Bu arada, olumsuz "Paylaşım işe yaramıyor !!!" yorumlar. Şerefe Facebook: * (


Yaklaşık bir yıldır birden fazla revizyonla kırıldı, neden düzeltmeyeceklerini anlamıyorum !!
Nathan Schwermann

4
Hala kırık. Aptal facebook sdk'lerini kullanman için bilerek düzeltmediklerini düşünmeye başladım.
UncleIstvan

5
Görünüşe göre Facebook artık bu davranışın bozuk olduğunu düşünmediğini ve onu değiştirmeyeceğini resmen yanıtladı: developer.facebook.com/bugs/332619626816423
Scott W

1
Yani en azından düzeltme veya geçici çözüm yok mu? Boş mesajla yaşamak zorunda mıyız? : /
Ixx

1
Maalesef tek düzeltme veya geçici çözüm, SDK'larını uygulamanıza entegre etmektir.
Joseph Woodward

Yanıtlar:


97

Facebook uygulaması, ya EXTRA_SUBJECTda EXTRA_TEXTalanlarını işlemez .

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

Teşekkürler @billynomates:

Mesele şu ki, EXTRA_TEXTalana bir URL koyarsanız , işe yarıyor. Sanki kasıtlı olarak herhangi bir metni çıkarıyorlar.


30
Mesele şu ki, EXTRA_TEXT alanına bir URL koyarsanız , işe yarıyor. Sanki kasıtlı olarak herhangi bir metni çıkarıyorlar.
MSpeed

1
Bunun hala iOS'ta (yazma sırasında) çalışması gerçekten aptalca, ancak Android'de çalışmıyor.
Peter K.

Facebook'ta paylaşım amacıyla yalnızca bağlantılar paylaşılabilir.
Misha Akopov

2
Kullanıcıların içeriği elle
yazması

1
@PeterK. facebook üzerinden mesaj göndermenin bir yolunu buldunuz mu?
Karan Khurana

115

Görünüşe göre Facebook artık (2014 itibariyle) paylaşma ekranını özelleştirmenize izin vermiyor, sadece sharer.php URL'sini açıyor veya Android amaçlarını daha özel yöntemlerle kullanıyor olsanız da. Örneğin şu cevaplara bakın:

Neyse, düz Amaçları kullanarak, sen yapabilirsiniz hala bir URL, ancak onunla herhangi bir varsayılan metin paylaşmak gibi billynomates yorumladı . (Ayrıca, paylaşılacak URL'niz yoksa, Facebook uygulamasını boş "Yazı Yaz" (yani durum güncellemesi) iletişim kutusu ile başlatmak da aynı derecede kolaydır; aşağıdaki kodu kullanın ama dışarıda bırakın EXTRA_TEXT.)

İşte gelmez Bulduğum en iyi çözüm değil herhangi Facebook SDK'lerini kullanarak içerir.

Bu kod , yüklüyse resmi Facebook uygulamasını doğrudan açar ve aksi halde bir tarayıcıda sharer.php'yi açmaya geri döner. (Bu sorudaki diğer çözümlerin çoğu , hiç de ideal olmayan devasa bir "... kullanarak eylemi tamamla" iletişim kutusu açar!)

String urlToShare = "/programming/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.katanaPaket adı ile ilgili olarak MatheusJardimB'nin yorumuna bakın .)

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

görüntü açıklamasını buraya girin


3
"com.facebook.katana" Facebook uygulamasının paket adıdır ve "com.facebook.orca" FB Messenger uygulaması içindir. İstediğiniz uygun pckg'ye geçebilirsiniz. Birini belirtmezseniz, bulunan ilk kullanılacaktır (iyi değil)
MatheusJardimB

1
İyi yakaladın, teşekkürler! Cevabı güncelledim. Facebook'un önekle de eşleşecek başka uygulamaları da ( Ana Sayfa ve Sayfa Yöneticisi ) yayınladığı ortaya çıktı com.facebook.
Jonik

merhaba ... edittext yazısını doldurmak istersem facebook ile nasıl çalışılır.
Das

url ile de metin nasıl ayarlanır?
Anand Savjani

Yapamazsınız (en başında kalın harflerle belirtildiği gibi). Lütfen sadece cevabı okuyun.
Jonik

16

Olağan yol

İstediğiniz şeyi yaratmanın olağan yolu, basitçe 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ışıyor.

Alternatif yol (belki)

Bunu yapmanın olası problemi, mesajın e-posta, SMS vb. Yoluyla gönderilmesine de izin vermenizdir. Aşağıdaki kod, bir uygulamada kullandığım ve kullanıcının bana e-posta göndermesine izin veren bir şeydir. -mail kullanarak Gmail. Sadece Facebook ile çalışmasını sağlamak için değiştirmeyi deneyebileceğinizi tahmin ediyorum.

Herhangi bir hataya veya istisnaya nasıl yanıt verdiğinden emin değilim (Facebook kurulu değilse bunun olacağını 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();
    }

3
Cevabın için teşekkürler. Yine de kafamı karıştıran şey bu, yayınladığınız ilk kod parçacığı, paylaşma amaçlı diğer tüm uygulamalara gönderi yapmak için iyi çalışıyor, ancak Facebook'un niyetiyle kullanıcıyı sanki göndermiyormuş gibi boş bir "Bir şeyler yazın" facebook sayfasına götürüyor ( veya muhtemelen EXTRA_TEXT alanındaki metni alır.
Joseph Woodward

Hmm, tabletimdeki ilkiyle gayet iyi çalışıyor. Belirtildiği gibi EXTRA_SUBJECT alanı olmadan deneyin. Bu fark yaratıyor gibi görünüyor.
Michell Bak

1
Aslında, sadece kontrol ettim ve evet - bozuk. Çalışırdım.
Michell Bak

Evet, düzenlediğim ilk yazımda da belirtildiği gibi, Facebook uygulamasında Nisan 2011'den beri var olan bir hata gibi görünüyor (!). Yine de, sorumu yanıtlamak için zaman ayırdığınız için teşekkür ederim.
Joseph Woodward

4
@TomSusel Evet, Facebook bir araya gelmeli. Yine de bir URL eklerken çalışır. Olumsuz oy için teşekkürler ;-)
Michell Bak

5

Sadece ikisini de paylaşabileceğini öğrendim İkisini birden kullanarak değil Metin veya ResimIntents . Kod paylarının yalnızca Aşağıda Görüntü varsa veya yalnızca metin halinde Görüntü çıkışları yok. İkisini de paylaşmak istiyorsanız, Facebook SDK'yı buradan kullanmanız gerekir .

Aşağıdaki kod yerine başka bir çözüm kullanıyorsanız , Facebook Lite'ın paket adı olan com.facebook.lite paket adını da belirtmeyi unutmayın . Test etmedim ama com.facebook.orca Facebook Messenger'ın paket adı hedeflemek istiyorsanız .

WhatsApp , Twitter ile paylaşmak için daha fazla yöntem ekleyebilirsiniz ...

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

Dosyadan Uri almak için 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;
    }    
}

FileProvider'ı yazmak için şu bağlantıyı kullanın: https://github.com/codepath/android_guides/wiki/Sharing-Content-with-Intents


4

İşte yaptığım şey (metin için). Kodda, panoya gereken metni kopyalıyorum. Bir kişi paylaşım amacı düğmesini ilk kez kullanmaya çalıştığında, facebook'ta paylaşmak isteyip istemediklerini açıklayan bir bildirim açıyorum, 'Facebook'u tıklamaları ve ardından yapıştırmak için uzun basmaları gerekiyor (bu, Facebook'un farkında olmalarını sağlamak içindir. android intent sistemini KIRDI). Ardından ilgili bilgiler sahadadır. Ayrıca bu gönderiye bir bağlantı ekleyebilirim, böylece kullanıcılar da şikayet edebilir ...

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 önceki sürümlerle uğraşmak için bir yöntem var

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

Lollipop'ta (21), Intent.EXTRA_REPLACEMENT_EXTRASözellikle Facebook'un amacını geçersiz kılmak için kullanabilirsiniz (ve yalnızca bir bağlantı belirtebilirsiniz)

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

2

Görünüşe göre Facebook'un 4.0.0 sürümünde pek çok şey değişti. Bu 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);
    }

1
SupportUtils nedir?
Silvia H

2

Bu çözüm de işe yarıyor. Facebook kurulu değilse, sadece normal paylaşım iletişim kutusunu çalıştırır. Varsa ve giriş yapmadıysanız, giriş ekranına gider. Giriş yaptıysanız, paylaşım iletişim kutusunu açar ve Amaç Ekstra kısmından "Paylaş url" yi yerleştirir.

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

0

İşte Facebook Uygulamasını Link ile açan 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);

2
benim için çalışmadı. muhtemelen Facebook, ImplicitShareIntentHandler'ın adını değiştirmiştir.
Hesam

0
    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

Facebook, düz metin verilerinin paylaşılmasına izin vermiyor, Intent.EXTRA_TEXTancak bunu kullanarak facebook messanger ile metin + bağlantı paylaşabilirsiniz, bu benim için iyi çalışıyor

            Intent sendIntent = new Intent();
            sendIntent.setAction(Intent.ACTION_SEND);
            sendIntent.putExtra(Intent.EXTRA_TEXT, text+url link);
            sendIntent.setType("text/plain");
            sendIntent.setPackage("com.facebook.orca");
            startActivity(sendIntent);

0

Uygulamamdan facebook'a bir mesaj iletmenin en kolay yolu programlı olarak panoya kopyalamak ve kullanıcıyı yapıştırma seçeneğine sahip oldukları konusunda uyarmaktı. Kullanıcıyı manuel olarak yapmaktan kurtarır; uygulamam yapıştırmıyor ama kullanıcı yapıştırabilir.

...
if (app.equals("facebook")) {
    // overcome fb 'putExtra' constraint;
    // copy message to clipboard for user to paste into fb.
    ClipboardManager cb = (ClipboardManager) 
            getSystemService(Context.CLIPBOARD_SERVICE);
    ClipData clip = ClipData.newPlainText("post", msg);
    cb.setPrimaryClip(clip);

    // tell the to PASTE POST with option to stop showing this dialogue
    showDialog(this, getString(R.string.facebook_post));
}
startActivity(appIntent);
...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.