Android Facebook分享接入

1,295 阅读3分钟

最近公司SDK项目接到了新需求,需要接入Facebook分享,本篇文章介绍下Facebook分享的接入。

添加依赖

在项目app module的build.gradle中的dependencies中添加依赖:

dependencies {
    implementation 'com.facebook.android:facebook-share:14.0.0'
}

配置Manifeset

配置需要用到应用编号,可以在应用后台中找到,如图:

WeChat5cfa11bbc5526fa8a6604ed5b0f48276.png

String.xmlAndroidManifest中添加如下代码:

<resources>
    <string name="facebook_app_id">应用编号</string>
    <string name="fb_login_protocol_scheme">fb应用编号</string>
    <string name="facebook_client_token">客户端口令</string>
</resources>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-permission android:name="android.permission.INTERNET" />
    
    <queries>
        <!--有针对android 11以上的设备需要添加-->
        <provider
            android:authorities="com.facebook.katana.provider.PlatformProvider"
            tools:ignore="ExportedContentProvider" />
    </queries>

    <application >

        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id" />

        <meta-data
            android:name="com.facebook.sdk.ClientToken"
            android:value="@string/facebook_client_token" />

        <activity
            android:name="com.facebook.FacebookActivity"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" />

        <provider
            android:name="com.facebook.FacebookContentProvider"
            android:authorities="com.facebook.app.FacebookContentProvider{应用编号}"
            android:exported="true"
            tools:ignore="ExportedContentProvider" />        

    </application>
</manifest>

分享

发起分享API

Facebook 提供了三种发起分享的方式:

  • ShareButton 添加到xml中。
ShareButton shareButton = (ShareButton)findViewById(R.id.fb_share_button);
shareButton.setShareContent(content);
  • ShareDialog
class FacebookShareActivity : AppCompatActivity() {

    private var shareDialog: ShareDialog? = null

    private lateinit var callbackManager: CallbackManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<LayoutFacebookShareActivityBinding>(this, R.layout.layout_facebook_share_activity)

        callbackManager = CallbackManager.Factory.create()
        shareDialog = ShareDialog(this)
        shareDialog?.registerCallback(callbackManager, object : FacebookCallback<Sharer.Result> {
            override fun onSuccess(result: Sharer.Result) {
                Log.i(TAG, "share success postId:${result.postId}")
            }

            override fun onCancel() {
                Log.i(TAG, "share cancel")
            }

            override fun onError(error: FacebookException) {
                Log.i(TAG, "share failed error:${error.message}")
            }
        })
        
        shareDialog?.show(activityOrFragment, content);
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        //注意,如果不是使用AndroidX下的Activity或Fragment,需要在onActivityResult添加如下代码
        callbackManager.onActivityResult(requestCode, resultCode, data)
    }
}
  • MessageDialog 分享到Message应用。
class FacebookShareActivity : AppCompatActivity() {

    private var messageDialog: MessageDialog? = null

    private lateinit var callbackManager: CallbackManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<LayoutFacebookShareActivityBinding>(this, R.layout.layout_facebook_share_activity)

        callbackManager = CallbackManager.Factory.create()
        messageDialog = MessageDialog(this)
        messageDialog?.registerCallback(callbackManager, object : FacebookCallback<Sharer.Result> {
            override fun onSuccess(result: Sharer.Result) {
                Log.i(TAG, "share success postId:${result.postId}")
            }

            override fun onCancel() {
                Log.i(TAG, "share cancel")
            }

            override fun onError(error: FacebookException) {
                Log.i(TAG, "share failed error:${error.message}")
            }
        })
        
        messageDialog?.show(activityOrFragment, content);
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        //注意,如果不是使用AndroidX下的Activity或Fragment,需要在onActivityResult添加如下代码
        callbackManager.onActivityResult(requestCode, resultCode, data)
    }
}

分享链接

分享链接示例代码如下:

class FacebookShareActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<LayoutFacebookShareActivityBinding>(this, R.layout.layout_facebook_share_activity)
        
        binding.btnShareLink.setOnClickListener {
            val shareLinkContent = ShareLinkContent.Builder()
                //设置分享链接
                .setContentUrl(Uri.parse("https://developers.facebook.com"))
                //设置引文
                .setQuote("Connect on a global scale")
                //设置话题标签
                .setShareHashtag(ShareHashtag.Builder()
                    .setHashtag("#ConnectTheWorld")
                    .build())
                .build()

            shareDialog?.show(shareLinkContent)
        }
    }
}

效果如图:

share link.gif

分享单张图片

分享单张图片示例代码如下:

class FacebookShareActivity : AppCompatActivity() {

    private val pickPhoto = registerForActivityResult(PickSinglePhotoContract()) { uri ->
        if (uri != null) {
            val sharePhoto = SharePhoto.Builder()
                //设置分享的bitmap
                //.setBitmap()
                //设置分享图片的uri
                .setImageUrl(uri)
                //设置标题,必须是用户自己输入的(平台政策 (2.3) 禁止预填内容)
                .setCaption("")
                //设置分享的图片是由用户还是应用程序生成的
                .setUserGenerated(true)
                .build()

            val sharePhotoContent = SharePhotoContent.Builder()
                .addPhoto(sharePhoto)
                .build()

            shareDialog?.show(sharePhotoContent)
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<LayoutFacebookShareActivityBinding>(this, R.layout.layout_facebook_share_activity)

        binding.btnShareSinglePicture.setOnClickListener {
            pickPhoto.launch(null)
        }
    }
}

效果如图:

share single picture.gif

分享多张图片

分享多张图片示例代码如下:

class FacebookShareActivity : AppCompatActivity() {

    private val pickMultiplePhoto = registerForActivityResult(PickMultiplePhotoContract()) { uri ->
        if (!uri.isNullOrEmpty()) {
            multiplePhotoList.addAll(uri)
            val sharePhotos = ArrayList<SharePhoto>()
            uri.forEach {
                val sharePhoto = SharePhoto.Builder()
                    //设置分享的bitmap
                    //.setBitmap()
                    //设置分享图片的uri
                    .setImageUrl(it)
                    //设置标题,必须是用户自己输入的(平台政策 (2.3) 禁止预填内容)
                    .setCaption("Test Share photo")
                    //设置分享的图片是由用户还是应用程序生成的
                    .setUserGenerated(true)
                    .build()

                sharePhotos.add(sharePhoto)
            }

            val sharePhotoContent = SharePhotoContent.Builder()
                .addPhotos(sharePhotos)
                .build()

            shareDialog?.show(sharePhotoContent)
        }
    }
  
    private var multiplePhotoList = ArrayList<Uri>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<LayoutFacebookShareActivityBinding>(this, R.layout.layout_facebook_share_activity)

        binding.btnShareMultiplePicture.setOnClickListener {
            pickMultiplePhoto.launch(null)
        }
    }
}

效果如图:

share multiple picture.gif

分享视频

分享视频示例代码如下:

class FacebookShareActivity : AppCompatActivity() {

    private val pickVideo = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
        if (uri != null) {
            multipleVideoList.add(uri)
            val shareVideo = ShareVideo.Builder()
                //设置视频Uri
                .setLocalUrl(uri)
                .build()

            val shareVideoContent = ShareVideoContent.Builder()
                .setVideo(shareVideo)
                //设置视频标题
                .setContentTitle("Test Share Video")
                //设置视频描述
                .setContentDescription("This is a test video to test facebook sharing")
                .build()

            shareDialog?.show(shareVideoContent)
        }
    }

    private var multipleVideoList = ArrayList<Uri>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<LayoutFacebookShareActivityBinding>(this, R.layout.layout_facebook_share_activity)

        binding.btnShareSingleVideo.setOnClickListener {
            pickVideo.launch(MimeType.VIDEO_All)
        }
    }
}

效果如图:

share video.gif

分享多媒体资源(照片、视频混合)

最多只能分享6个多媒体资源,示例代码如下:

class FacebookShareActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<LayoutFacebookShareActivityBinding>(this, R.layout.layout_facebook_share_activity)

        binding.btnShareMultipleMedium.setOnClickListener {
            val multipleMedium = ArrayList<ShareMedia<*, *>>()

            multiplePhotoList.forEach {
                val sharePhoto = SharePhoto.Builder()
                    .setImageUrl(it)
                    .setUserGenerated(true)
                    .build()
                multipleMedium.add(sharePhoto)
            }
            multipleVideoList.forEach {
                val shareVideo = ShareVideo.Builder()
                    //设置视频Uri
                    .setLocalUrl(it)
                    .build()

                multipleMedium.add(shareVideo)
            }

            val shareMultipleMedium = ShareMediaContent.Builder()
                .addMedia(multipleMedium)
                .build()

            shareDialog?.show(shareMultipleMedium)
        }
    }
}

效果如图:

share multiple medium.gif