Android开发FaceBook图文分享方法
方式一:集成方法ShareSDK(搬运于 官方文档):
准备工作:
1、获取正确配置并链接到 Android 应用的 Facebook 应用编号。请参阅 Android 新手入门,添加 Facebook 应用编号
2、生成 Android 密钥散列并将其添加到开发者资料页
代码中获取当前apk打包签名密钥散列,将调试签名和发布签名的密钥散列都配置到FaceBook开发者平台的应用当中。也可以使用官方文档的提供获取方式。
PackageInfo info = null;
try {
info = getPackageManager().getPackageInfo("你APP包名",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash: ", Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (Exception e) {
e.printStackTrace();
}
代码工作:
项目build.gradle添加mavenCentral仓库
repositories {
// ...
mavenCentral()
}
app build.gradle添加依赖
dependencies {
// ...
implementation 'com.facebook.android:facebook-share:5.15.3'
}
AndroidManifest.xml中添加相关权限、meta-data、FacebookActivity、FacebookContentProvider:
Note:应用ID为开发者平台创建的应用编号
<!-- 网络 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 读外存(根据实际具体情况申请) -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="应用ID"/>
<activity android:name="com.facebook.FacebookActivity" />
<provider android:authorities="com.facebook.app.FacebookContentProvider应用ID"
android:name="com.facebook.FacebookContentProvider"
android:exported="true"/>
分享引文链接:ShareLinkContent
ShareLinkContent content = new ShareLinkContent.Builder()
.setContentUrl(Uri.parse("https://www.baidu.com"))
.build();
// 对话框
ShareDialog shareDialog = new ShareDialog(this);
// 分享回调
shareDialog.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>() {
@Override
public void onSuccess(Sharer.Result result) {
Log.e(TAG, "onSuccess");
}
@Override
public void onCancel() {
Log.e(TAG, "onCancel");
}
@Override
public void onError(FacebookException error) {
Log.e(TAG, "onError" + error.toString());
}
});
shareDialog.show(content);
分享图片:SharePhotoContent
String filePath = Environment.getExternalStorageDirectory() + "/image.jpg";
Bitmap image = BitmapFactory.decodeFile(filePath);
SharePhoto photo = new SharePhoto.Builder()
.setBitmap(image)
.build();
SharePhotoContent content = new SharePhotoContent.Builder()
.addPhoto(photo)
.build();
分享视频:ShareVideoContent
Uri videoFileUri = ...
ShareVideo = new ShareVideo.Builder()
.setLocalUrl(videoUrl)
.build();
ShareVideoContent content = new ShareVideoContent.Builder()
.setVideo(video)
.build();
多媒体:ShareMediaContent
(1)用户需要安装 71 或更高版本的原生 Android 版 Facebook 应用。
(2)用户每次可以分享最多包含 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);
在旧版本的 Android 版 SDK 中,您的应用必须先检查设备是否安装了原生 Facebook 应用,然后才可打开分享对话框。若未安装 Facebook 应用,则您必须自行提供代码,才能调用回退对话框。
现在,SDK 将自动检查设备上是否安装了原生 Facebook 应用。如果未安装,SDK 会将用户切换到默认浏览器并打开动态发布对话框。
总结:
使用官方ShareDialog分享,部分手机无法调起分享功能,直接回调了onError方法,而且分享跳转貌似依赖*墙网络。推荐使用方式二。
方式二:隐式意图(同样也适用其他APP,如Instagram,Twitter等)
Intent.ACTION_SEND
Intent.ACTION_SEND_MULTIPLE(Facebook支持,其他应用不一定支持)
// 上下文实例
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));
调用前,务必需要检查分享目标应用是否安装。