最近公司SDK项目接到了新需求,需要接入Facebook分享,本篇文章介绍下Facebook分享的接入。
添加依赖
在项目app module的build.gradle中的dependencies中添加依赖:
dependencies {
implementation 'com.facebook.android:facebook-share:14.0.0'
}
配置Manifeset
配置需要用到应用编号,可以在应用后台中找到,如图:
在String.xml
和AndroidManifest
中添加如下代码:
<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)
}
}
}
效果如图:
分享单张图片
分享单张图片示例代码如下:
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)
}
}
}
效果如图:
分享多张图片
分享多张图片示例代码如下:
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)
}
}
}
效果如图:
分享视频
分享视频示例代码如下:
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)
}
}
}
效果如图:
分享多媒体资源(照片、视频混合)
最多只能分享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)
}
}
}
效果如图: