小知识,大挑战!本文正在参与「程序员必备小知识」创作活动
本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。
美国时间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
{2992757927647074{"
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));
}