❤️Android 集成 Facebook 分享❤️

4,704 阅读3分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。

美国时间10月28日的 Connect 2021 直播活动中,Facebook 创始人马克·扎克伯格正式宣布,公司将更名为“Meta”,不管怎么改咱先接入功能。

上文讲到❤️Android 集成 Facebook 登录❤,这次咱们来了解了解Facebook分享。

创建应用、生成散列等相同点咱就不讲了,咱直接开始集成SDK。

🔥 集成Facebook SDK(分享)

💥 使用 Maven

🌀 1.在 build.gradle (Project) 中添加 jcenter()

buildscript {
    repositories {
        jcenter()
    }
}

🌀 2.在 build.gradle (Module: app) 并中添加库

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

🌀 3.构建项目

使用 Facebook 登录 SDK 时,如果未禁用事件自动记录功能,那么系统将自动记录和收集应用事件,以用于 Facebook 分析。

💥 配制清单文件

在 AndroidManifest.xml 中设置 ContentProvider,其中 {2992757927647074(APP_id)} 是你的应用编号

<provider android:authorities="com.facebook.app.FacebookContentProvider
&#123;2992757927647074&#123;"
          android:name="com.facebook.FacebookContentProvider"
          android:exported="true"/>

如果此处报错:

java.lang.IllegalStateException: A ContentProvider for this app was not set up in the AndroidManifest.xml, please add com.facebook.app.FacebookContentProvider2884869658400416 as a provider to your AndroidManifest.xml file. See developers.facebook.com/docs/sharin… for more info.

可修改为

<provider
    android:name="com.facebook.FacebookContentProvider"
    android:authorities="com.facebook.app.FacebookContentProvider2884869658400416"
    android:exported="true" />

💥 初始化SDK

public class App extends BaseApplication {
    @Override
    public void onCreate() {
        super.onCreate();
        FacebookSdk.sdkInitialize(getApplicationContext());
        AppEventsLogger.activateApp(this);
    }
}

💥 分享类型

用户必须安装 7.0 或更高版本的原生 Android 版 Facebook 应用才能分享。

🌀 链接

ShareLinkContent content = new ShareLinkContent.Builder()
        .setContentUrl(Uri.parse("https://developers.facebook.com"))
        .build();

🌀 照片

Bitmap image = ...
SharePhoto photo = new SharePhoto.Builder()
        .setBitmap(image)
        .build();
SharePhotoContent content = new SharePhotoContent.Builder()
        .addPhoto(photo)
        .build();

🌀 视频

Uri videoFileUri = ...
ShareVideo = new ShareVideo.Builder()
        .setLocalUrl(videoUrl)
        .build();
ShareVideoContent content = new ShareVideoContent.Builder()
        .setVideo(video)
        .build();

🌀 多媒体(同时包含照片和视频)

用户可以从你的应用向 Facebook 分享同时包含照片和视频的内容。请注意以下事项:

  • 用户需要安装 7.1 或更高版本的原生 Android 版 Facebook 应用。
  • 用户每次可以分享最多包含 6 个照片和视频元素的内容。
SharePhoto sharePhoto1 = new SharePhoto.Builder()
    .setBitmap(...)
    .build();
SharePhoto sharePhoto2 = new SharePhoto.Builder()
    .setBitmap(...)
    .build();
ShareVideo shareVideo1 = new ShareVideo.Builder()
    .setLocalUrl(...)
    .build();
ShareVideo shareVideo2 = new ShareVideo.Builder()
    .setLocalUrl(...)
    .build();

ShareContent shareContent = new ShareMediaContent.Builder()
    .addMedium(sharePhoto1)
    .addMedium(sharePhoto2)
    .addMedium(shareVideo1)
    .addMedium(shareVideo2)
    .build();

ShareDialog shareDialog = new ShareDialog(...);
shareDialog.show(shareContent, Mode.AUTOMATIC);

🔥 开始测试

💥 准备工作

    private ShareDialog shareDialog;
    private CallbackManager callbackManager;
    public void setShareFaceBook(String quote, String contentUrl) {
        if (callbackManager == null) {
            callbackManager =  CallbackManager.Factory.create();
        }
        shareDialog = new ShareDialog(this);
        //注册分享状态监听回调接口
        shareDialog.registerCallback(callbackManager, facebookCallback);
        if (shareDialog.canShow(ShareLinkContent.class)) {
            ShareLinkContent linkContent = new ShareLinkContent.Builder()
                    .setQuote(quote)
                    .setContentUrl(Uri.parse(contentUrl))
                    .build();
            shareDialog.show(linkContent);
        }
    }
    private FacebookCallback facebookCallback = new FacebookCallback() {

        @Override
        public void onSuccess(Object o) {
            MLog.e("onSuccess");
        }

        @Override
        public void onCancel() {
            MLog.e("onCancel");
        }

        @Override
        public void onError(FacebookException error) {
            MLog.e("onError");
        }
    };

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        callbackManager.onActivityResult(requestCode, resultCode, data);
        super.onActivityResult(requestCode, resultCode, data);
    }

💥 调用

setShareFaceBook("三人行必有我师焉;择其善者而从之,其不善者而改之","https://shuaici.blog.csdn.net/");

💥 结果

日志打印结果:E/-SCC-: onSuccess

这里的图片是Facebook自己抓取的,分享的内容上面有小锁,是因为我选的仅限自己可见。

🔥 注意事项

在使用分享时,不要在应用内有偿引导用户分享,否则会被Facebook那边警告并下架应用,然后需要邮件申诉等才能解决。

使用官方ShareDialog分享,部分手机无法调起分享功能,直接回调了onError方法,而且分享跳转貌似依赖墙网络。推荐使用隐式意图(同样也适用其他APP,如Instagram,Twitter等)。此方法来自掘友推荐:FaceBook图文分享方法

🔥 隐式意图

Intent.ACTION_SEND

Intent.ACTION_SEND_MULTIPLE(Facebook支持,其他应用不一定支持)

    private void shareFacebook() {
        // 上下文实例
        Context context = ...;
        // Uri数组列表
        ArrayList<Uri> uriArrayList = ...;
        // 意图
        Intent intent;
        // 单张图片
        if (uriArrayList.size() == 1) {
            intent = new Intent(Intent.ACTION_SEND);
            intent.putExtra(Intent.EXTRA_STREAM, uriArrayList.get(0));
        } else {
            // 多张图片
            intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
            intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriArrayList);
        }

        // 图片
        intent.setType("image/*");
        // 视频
//        intent.setType("video/*");
        // 多媒体
//        intent.setType("video/;image/");

        // Facebook包名
        intent.setPackage("com.facebook.katana");
        context.startActivity(Intent.createChooser(intent, title));
    }

🔥 传送门

💥 分享文档传送门

💥 创建应用传送门

💥 应用事件测试传送门

💥 GithubSDKDemo传送门