最近做facebook(分享sdk版本爲4.34.0)分享圖片,根據在 Android 平臺分享可知,分享圖片需要安裝7.0以上客戶端。(經測試,在不安裝facebook客戶端時,分享鏈可以)。
1: 之前的分享方式
private void postPhoto() {
Bitmap image = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon);
SharePhoto sharePhoto = new SharePhoto.Builder().setBitmap(image).build();
ArrayList<SharePhoto> photos = new ArrayList<>();
photos.add(sharePhoto);
SharePhotoContent sharePhotoContent =
new SharePhotoContent.Builder().setPhotos(photos).build();
/**步驟1 可以分享,使用ShareDialog分享 */
if (ShareDialog.canShow(SharePhotoContent.class)) {
shareDialog.show(sharePhotoContent);
// 步驟2 如果已經登錄且有publish_actions權限,使用ShareApi分享
} else if (hasPublishPermission()) {
ShareApi.share(sharePhotoContent, shareCallback);
//步驟3 登錄並分享
} else {
pendingAction = PendingAction.POST_PHOTO;
// We need to get new permissions, then complete the action when we get called back.
LoginManager.getInstance().logInWithPublishPermissions(
this,
Arrays.asList("publish_actions"));
}
}
其中**hasPublishPermission()**函數如下:
private boolean hasPublishPermission() {
return AccessToken.isCurrentAccessTokenActive()
&& AccessToken.getCurrentAccessToken()
.getPermissions().contains("publish_actions");
}
但是publish_actions 權限已移除。已獲准使用 publish_actions 的應用可以繼續使用此權限,直至 2018 年 8 月 1 日。如果您想方便您的應用用戶在此日期後與 Facebook 和 Instagram 分享內容,建議您使用我們的共享產品。
參考:facebook重大變更
2: 那麼4.34.0版本在沒有安裝客戶端的情況下如何分享圖片?
根據上面分析以前分享的方式中的步驟2和步驟3方式目前已經無效了。
因此現在的方案爲(代碼如下):先判斷能否分享,若不能則登錄後直接分享。(經測試,未安裝客戶端時通過webview登錄後可以分享圖片)
登錄代碼參考:Android 版 Facebook 登錄 — 快速入門
// canShow 判斷分享類型&&是否爲已登錄,下文給分析
if (ShareDialog.canShow(SharePhotoContent.class)) {
// 分享圖片
sharePhoto(activity, image);
} else {// 登錄成功後分享
FacebookSdk.sdkInitialize(activity.getApplicationContext());
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager ,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// 分享圖片
sharePhoto(activity, image);
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException exception) {
}
});
LoginManager.getInstance().logInWithReadPermissions(activity,
Arrays.asList("public_profile"));
}
3 . canShow() 簡單分析
// 1
ShareDialog.canShow(SharePhotoContent.class)
// 2
public static boolean canShow(Class<? extends ShareContent> contentType) {
return canShowWebTypeCheck(contentType)// to 3
|| canShowNative(contentType);
}
//3 檢查
private static boolean canShowWebTypeCheck(Class<? extends ShareContent> contentType) {
return ShareLinkContent.class.isAssignableFrom(contentType)
|| ShareOpenGraphContent.class.isAssignableFrom(contentType)
// 分享圖片
|| SharePhotoContent.class.isAssignableFrom(contentType)
//登錄狀態 to 4
&& AccessToken.isCurrentAccessTokenActive();
}
//4 登錄狀態: accessToken 不爲空&&不過期
public static boolean isCurrentAccessTokenActive() {
AccessToken accessToken = AccessTokenManager.getInstance().getCurrentAccessToken();
return accessToken != null && !accessToken.isExpired();
}