未安裝facebook客戶端分享圖片問題記錄

最近做facebook(分享sdk版本爲4.34.0)分享圖片,根據在 Android 平臺分享可知,分享圖片需要安裝7.0以上客戶端。(經測試,在不安裝facebook客戶端時,分享鏈可以)。

原文地址

1: 之前的分享方式

facebook分享demo中的代碼:

 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();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章