Facebook SDK for Android providing comprehensive integration with Facebook platform features including Login, Sharing, Messenger, App Links, Analytics, and Graph API
—
The Facebook Share module provides comprehensive content sharing capabilities including links, photos, videos, and Open Graph stories. It supports both programmatic sharing via ShareApi and UI-based sharing through various dialog implementations.
Programmatic sharing without user interaction:
class ShareApi(
content: ShareContent<*, *>,
mode: ShareApi.Mode
) {
enum class Mode {
AUTOMATIC, // Choose best available method
NATIVE, // Use native Facebook app
WEB // Use web-based sharing
}
fun share(callback: FacebookCallback<Sharer.Result>?)
fun canShare(): Boolean
companion object {
fun share(
activity: Activity,
shareContent: ShareContent<*, *>,
callback: FacebookCallback<Sharer.Result>?
)
}
}
interface Sharer {
data class Result(val postId: String?)
}// Create share content
val linkContent = ShareLinkContent.Builder()
.setContentUrl(Uri.parse("https://example.com"))
.setQuote("Check out this amazing content!")
.build()
// Share programmatically
val shareApi = ShareApi(linkContent, ShareApi.Mode.AUTOMATIC)
if (shareApi.canShare()) {
shareApi.share(object : FacebookCallback<Sharer.Result> {
override fun onSuccess(result: Sharer.Result) {
Log.d("Share", "Shared successfully, post ID: ${result.postId}")
}
override fun onCancel() {
Log.d("Share", "Share cancelled")
}
override fun onError(error: FacebookException) {
Log.e("Share", "Share error: ${error.message}")
}
})
} else {
Log.w("Share", "Cannot share this content type")
}UI-based sharing dialogs that provide a rich sharing experience:
class ShareDialog : FacebookDialogBase<ShareContent<*, *>, ShareDialog.Result> {
constructor(activity: Activity)
constructor(fragment: Fragment)
constructor(fragment: android.app.Fragment)
companion object {
fun canShow(contentType: Class<out ShareContent<*, *>>): Boolean
}
fun show(content: ShareContent<*, *>)
fun registerCallback(
callbackManager: CallbackManager,
callback: FacebookCallback<Result>
)
data class Result(val postId: String?)
}
class MessageDialog : FacebookDialogBase<ShareContent<*, *>, MessageDialog.Result> {
constructor(activity: Activity)
constructor(fragment: Fragment)
companion object {
fun canShow(contentType: Class<out ShareContent<*, *>>): Boolean
}
fun show(content: ShareContent<*, *>)
data class Result(val requestId: String?)
}class SharingActivity : AppCompatActivity() {
private lateinit var callbackManager: CallbackManager
private lateinit var shareDialog: ShareDialog
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
callbackManager = CallbackManager.Factory.create()
shareDialog = ShareDialog(this)
shareDialog.registerCallback(callbackManager, object : FacebookCallback<ShareDialog.Result> {
override fun onSuccess(result: ShareDialog.Result) {
Log.d("Share", "Content shared successfully")
}
override fun onCancel() {
Log.d("Share", "Share cancelled")
}
override fun onError(error: FacebookException) {
Log.e("Share", "Share error: ${error.message}")
}
})
// Share a link
shareLink()
}
private fun shareLink() {
val content = ShareLinkContent.Builder()
.setContentUrl(Uri.parse("https://developers.facebook.com"))
.setQuote("Learn how to integrate Facebook into your app!")
.build()
if (ShareDialog.canShow(ShareLinkContent::class.java)) {
shareDialog.show(content)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
callbackManager.onActivityResult(requestCode, resultCode, data)
super.onActivityResult(requestCode, resultCode, data)
}
}abstract class ShareContent<P : ShareContent<P, E>, E : ShareContent.Builder<P, E>> {
val contentUrl: Uri?
val peopleIds: List<String>
val placeId: String?
val ref: String?
val shareHashtag: ShareHashtag?
abstract class Builder<P : ShareContent<P, E>, E : Builder<P, E>> {
fun setContentUrl(contentUrl: Uri?): E
fun setPeopleIds(peopleIds: List<String>?): E
fun setPlaceId(placeId: String?): E
fun setRef(ref: String?): E
fun setShareHashtag(shareHashtag: ShareHashtag?): E
abstract fun build(): P
}
}
data class ShareHashtag(val hashtag: String) {
class Builder {
fun setHashtag(hashtag: String?): Builder
fun build(): ShareHashtag
}
}class ShareLinkContent : ShareContent<ShareLinkContent, ShareLinkContent.Builder> {
val quote: String?
class Builder : ShareContent.Builder<ShareLinkContent, Builder>() {
fun setQuote(quote: String?): Builder
override fun build(): ShareLinkContent
}
}class SharePhotoContent : ShareContent<SharePhotoContent, SharePhotoContent.Builder> {
val photos: List<SharePhoto>
class Builder : ShareContent.Builder<SharePhotoContent, Builder>() {
fun setPhotos(photos: List<SharePhoto>?): Builder
fun addPhoto(photo: SharePhoto?): Builder
override fun build(): SharePhotoContent
}
}
class SharePhoto {
val bitmap: Bitmap?
val imageUrl: Uri?
val caption: String?
val userGenerated: Boolean
class Builder {
fun setBitmap(bitmap: Bitmap?): Builder
fun setImageUrl(imageUrl: Uri?): Builder
fun setCaption(caption: String?): Builder
fun setUserGenerated(userGenerated: Boolean): Builder
fun build(): SharePhoto
}
}class ShareVideoContent : ShareContent<ShareVideoContent, ShareVideoContent.Builder> {
val video: ShareVideo
val previewPhoto: SharePhoto?
class Builder : ShareContent.Builder<ShareVideoContent, Builder>() {
fun setVideo(video: ShareVideo?): Builder
fun setPreviewPhoto(previewPhoto: SharePhoto?): Builder
override fun build(): ShareVideoContent
}
}
class ShareVideo {
val localUrl: Uri?
class Builder {
fun setLocalUrl(localUrl: Uri?): Builder
fun build(): ShareVideo
}
}class ShareMediaContent : ShareContent<ShareMediaContent, ShareMediaContent.Builder> {
val media: List<ShareMedia>
class Builder : ShareContent.Builder<ShareMediaContent, Builder>() {
fun setMedia(media: List<ShareMedia>?): Builder
fun addMedium(medium: ShareMedia?): Builder
override fun build(): ShareMediaContent
}
}
interface ShareMediafun sharePhotos(bitmaps: List<Bitmap>) {
val photos = bitmaps.map { bitmap ->
SharePhoto.Builder()
.setBitmap(bitmap)
.setCaption("Shared from my app")
.setUserGenerated(true)
.build()
}
val content = SharePhotoContent.Builder()
.setPhotos(photos)
.setShareHashtag(ShareHashtag.Builder().setHashtag("#MyApp").build())
.build()
if (ShareDialog.canShow(SharePhotoContent::class.java)) {
shareDialog.show(content)
}
}fun shareVideo(videoUri: Uri, previewBitmap: Bitmap?) {
val video = ShareVideo.Builder()
.setLocalUrl(videoUri)
.build()
val contentBuilder = ShareVideoContent.Builder()
.setVideo(video)
if (previewBitmap != null) {
val previewPhoto = SharePhoto.Builder()
.setBitmap(previewBitmap)
.build()
contentBuilder.setPreviewPhoto(previewPhoto)
}
val content = contentBuilder.build()
if (ShareDialog.canShow(ShareVideoContent::class.java)) {
shareDialog.show(content)
}
}UI components for easy sharing integration:
class ShareButton : ShareButtonBase {
constructor(context: Context)
constructor(context: Context, attrs: AttributeSet?)
var shareContent: ShareContent<*, *>?
fun registerCallback(
callbackManager: CallbackManager,
callback: FacebookCallback<Sharer.Result>
)
}
class SendButton : ShareButtonBase {
constructor(context: Context)
constructor(context: Context, attrs: AttributeSet?)
var shareContent: ShareContent<*, *>?
fun registerCallback(
callbackManager: CallbackManager,
callback: FacebookCallback<Sharer.Result>
)
}
abstract class ShareButtonBase : FacebookButtonBase {
protected val requestCode: Int
protected abstract fun getDialog(): FacebookDialogBase<*, *>?
}// In your layout: <com.facebook.share.widget.ShareButton ... />
val shareButton: ShareButton = findViewById(R.id.share_button)
// Set content to share
val linkContent = ShareLinkContent.Builder()
.setContentUrl(Uri.parse("https://example.com"))
.setQuote("Check this out!")
.build()
shareButton.shareContent = linkContent
// Register callback
shareButton.registerCallback(callbackManager, object : FacebookCallback<Sharer.Result> {
override fun onSuccess(result: Sharer.Result) {
Log.d("Share", "Shared successfully")
}
override fun onCancel() {
Log.d("Share", "Share cancelled")
}
override fun onError(error: FacebookException) {
Log.e("Share", "Share error: ${error.message}")
}
})Send game requests to friends:
class GameRequestDialog : FacebookDialogBase<GameRequestContent, GameRequestDialog.Result> {
constructor(activity: Activity)
constructor(fragment: Fragment)
companion object {
fun canShow(): Boolean
}
fun show(content: GameRequestContent)
data class Result(
val requestId: String,
val to: List<String>
)
}
class GameRequestContent : ShareContent<GameRequestContent, GameRequestContent.Builder> {
val message: String
val recipients: List<String>?
val title: String?
val data: String?
val actionType: ActionType?
val objectId: String?
val filters: Filters?
val suggestions: List<String>?
enum class ActionType {
SEND, ASKFOR, TURN
}
enum class Filters {
APP_USERS, APP_NON_USERS
}
class Builder : ShareContent.Builder<GameRequestContent, Builder>() {
fun setMessage(message: String): Builder
fun setRecipients(recipients: List<String>?): Builder
fun setTitle(title: String?): Builder
fun setData(data: String?): Builder
fun setActionType(actionType: ActionType?): Builder
fun setObjectId(objectId: String?): Builder
fun setFilters(filters: Filters?): Builder
fun setSuggestions(suggestions: List<String>?): Builder
override fun build(): GameRequestContent
}
}fun sendGameRequest() {
val content = GameRequestContent.Builder()
.setMessage("Come play with me!")
.setTitle("Join My Game")
.setActionType(GameRequestContent.ActionType.SEND)
.setFilters(GameRequestContent.Filters.APP_NON_USERS)
.build()
val dialog = GameRequestDialog(this)
dialog.registerCallback(callbackManager, object : FacebookCallback<GameRequestDialog.Result> {
override fun onSuccess(result: GameRequestDialog.Result) {
Log.d("GameRequest", "Request sent to ${result.to.size} friends")
}
override fun onCancel() {
Log.d("GameRequest", "Request cancelled")
}
override fun onError(error: FacebookException) {
Log.e("GameRequest", "Request error: ${error.message}")
}
})
if (GameRequestDialog.canShow()) {
dialog.show(content)
}
}Share Open Graph stories:
class ShareOpenGraphContent : ShareContent<ShareOpenGraphContent, ShareOpenGraphContent.Builder> {
val action: ShareOpenGraphAction
val previewPropertyName: String
class Builder : ShareContent.Builder<ShareOpenGraphContent, Builder>() {
fun setAction(action: ShareOpenGraphAction): Builder
fun setPreviewPropertyName(previewPropertyName: String): Builder
override fun build(): ShareOpenGraphContent
}
}
class ShareOpenGraphAction {
val actionType: String
fun putString(key: String, value: String?): ShareOpenGraphAction
fun putStringArrayList(key: String, value: ArrayList<String>?): ShareOpenGraphAction
fun putObject(key: String, value: ShareOpenGraphObject?): ShareOpenGraphAction
fun putObjectArrayList(key: String, value: ArrayList<ShareOpenGraphObject>?): ShareOpenGraphAction
class Builder(actionType: String, objectKey: String) {
fun putString(key: String, value: String?): Builder
fun putObject(key: String, value: ShareOpenGraphObject?): Builder
fun build(): ShareOpenGraphAction
}
}
class ShareOpenGraphObject {
fun putString(key: String, value: String?): ShareOpenGraphObject
fun putPhoto(key: String, value: SharePhoto?): ShareOpenGraphObject
fun putStringArrayList(key: String, value: ArrayList<String>?): ShareOpenGraphObject
class Builder {
fun putString(key: String, value: String?): Builder
fun putPhoto(key: String, value: SharePhoto?): Builder
fun build(): ShareOpenGraphObject
}
}Install with Tessl CLI
npx tessl i tessl/maven-com-facebook-android--facebook-android-sdk