2017-06-23 95 views
1

我將我的應用程序從本機Share Api轉換爲ShareDialog。對話框顯示正確,但我的應用程序沒有收到回覆,表示該帖子已完成/失敗/取消。我在一個片段中使用這個ShareDialog,我相信這可能是我的問題的一部分。爲什麼沒有收到回叫?Android Facebook SDK ShareDialog沒有返回回調

下面的代碼...

public class FacebookSocialSelector extends SocialSelector { 
    private static final String FACEBOOK_EMAIL_PREFERENCE = "facebook_email"; 
    private final CallbackManager mCallbackManager; 
    private String mFbEmail; 
    ShareDialog shareDialog; 

    public FacebookSocialSelector(ShareFragment fragment, View v, ImageView iconView) { 
     super(fragment, v, iconView); 


     // Social login 
     FacebookSdk.sdkInitialize(fragment.getContext().getApplicationContext()); 
     mCallbackManager = CallbackManager.Factory.create(); 
     LoginManager.getInstance().registerCallback(mCallbackManager, 
       mFacebookLoginCallback); 
     shareDialog = new ShareDialog(mFragment.getActivity()); 
     setBackgroundDisabledDrawable(R.drawable.sharebtn_left_disable); 
     setBackgroundEnabledDrawable(R.drawable.sharebtn_left_enable); 
     setDisabledDrawable(R.drawable.facebook_disable); 
     setEnabledDrawable(R.drawable.facebook_enable); 
    } 

    @Override 
    public void login() { 
     // Check for existing login 
     final String fbEmail; 
     if (mFbEmail == null) { 
      SharedPreferences prefs = PreferenceManager 
        .getDefaultSharedPreferences(mFragment.getActivity()); 
      fbEmail = prefs.getString(FACEBOOK_EMAIL_PREFERENCE, null); 
     } else { 
      fbEmail = mFbEmail; 
     } 

     if (AccessToken.getCurrentAccessToken() != null && fbEmail != null) { 
      if (Profile.getCurrentProfile() != null) { 
       finishLogin(true); 
       mFragment.fbInfo(Profile.getCurrentProfile().getId(), 
         Profile.getCurrentProfile().getName(), fbEmail); 
      } else { 
       new ProfileTracker() { 
        @Override 
        protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) { 
         finishLogin(true); 
         mFragment.fbInfo(currentProfile.getId(), 
           currentProfile.getName(), fbEmail); 
         Profile.setCurrentProfile(currentProfile); 
         stopTracking(); 
        } 
       }; 
       Profile.fetchProfileForCurrentAccessToken(); 
      } 
      return; 
     } 

     LoginManager.getInstance().logInWithReadPermissions(mFragment.getActivity(), 
       Arrays.asList("public_profile", "email")); 
    } 

    public void finishLogin(boolean success) { 
     if (success) { 
      select(); 
      mFragment.loginSuccess(); 
     } else { 
      mFragment.loginFailed("Could not login to FaceBook"); 
     } 
    } 



public void doPost(String message, Bitmap bitmap) { 
     ShareDialog shareDialog = new ShareDialog(mFragment.getActivity()); 
     if (ShareDialog.canShow(SharePhotoContent.class)) { 
      Bitmap image = bitmap; 
      SharePhoto photo = new SharePhoto.Builder() 
        .setBitmap(image) 
// Hashtag Still not working for some reason 
//       .setShareHashtag(new ShareHashtag.Builder() 
//         .setHashtag("#ConnectTheWorld") 
//         .build()); 
        .build(); 
      SharePhotoContent content = new SharePhotoContent.Builder() 
        .addPhoto(photo) 
        .build(); 
      shareDialog.show(content); 
      shareDialog.registerCallback(mCallbackManager, new FacebookCallback<Sharer.Result>() { 
       @Override 
       public void onSuccess(Sharer.Result result) { 
        mFragment.postFinish(true); 
       } 

       @Override 
       public void onCancel() { 
        mFragment.postFinish(false); 
       } 

       @Override 
       public void onError(FacebookException error) { 
        mFragment.postFinish(false); 
       } 
      }); 

     } 
    } 

    @Override 
    public void onLoginCallback(int requestCode, int resultCode, Intent data) { 
     mCallbackManager.onActivityResult(requestCode, resultCode, data); 
    } 

    @Override 
    public void onPostCallback(int requestCode, int resultCode, Intent data) { 
    } 

    private FacebookCallback<LoginResult> mFacebookLoginCallback = new FacebookCallback<LoginResult>() { 
     @Override 
     public void onSuccess(LoginResult loginResult) { 

      Iterator<String> iterator = 
        loginResult.getRecentlyGrantedPermissions().iterator(); 

      boolean hasPublishPermissions = false; 

      while (iterator.hasNext()) { 
       String s = iterator.next(); 
       if (s.equalsIgnoreCase("publish_actions")) { 
        hasPublishPermissions = true; 
       } 
      } 

      if (!hasPublishPermissions) { 
       LoginManager.getInstance().logInWithPublishPermissions(mFragment.getActivity(), 
         Arrays.asList("publish_actions")); 
      } else { 
       GraphRequest request = GraphRequest.newMeRequest(
         loginResult.getAccessToken(), 
         mGraphCallback); 
       Bundle parameters = new Bundle(); 
       parameters.putString("fields", "email"); 
       request.setParameters(parameters); 
       request.executeAsync(); 

      } 
     } 

     @Override 
     public void onCancel() { 
      Toast.makeText(mFragment.getActivity(), "Login Cancel", 
        Toast.LENGTH_LONG).show(); 
      finishLogin(false); 
      LoginManager.getInstance().logOut(); 
      AccessToken.setCurrentAccessToken(null); 
     } 

     @Override 
     public void onError(FacebookException exception) { 
      Toast.makeText(mFragment.getActivity(), exception.getMessage(), 
        Toast.LENGTH_LONG).show(); 
      finishLogin(false); 
      LoginManager.getInstance().logOut(); 
      AccessToken.setCurrentAccessToken(null); 
     } 
    }; 

    GraphRequest.GraphJSONObjectCallback mGraphCallback = new GraphRequest.GraphJSONObjectCallback() { 
     private ProfileTracker mProfileTracker; 

     @Override 
     public void onCompleted(JSONObject object, GraphResponse response) { 
      try { 
       mFbEmail = object.getString("email"); 
       final Profile currentProfile = Profile.getCurrentProfile(); 
       PreferenceManager 
         .getDefaultSharedPreferences(mFragment.getActivity()) 
         .edit() 
         .putString(FACEBOOK_EMAIL_PREFERENCE, mFbEmail) 
         .apply(); 
       mFragment.loginSuccess(); 

       if (currentProfile == null) { 
        // Profile not yet loaded 
        mFragment.fbInfo(null, null, mFbEmail); 
        mProfileTracker = new ProfileTracker() { 
         @Override 
         protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) { 
          finishLogin(true); 
          mFragment.fbInfo(currentProfile.getId(), 
            currentProfile.getName(), mFbEmail); 
          Profile.setCurrentProfile(currentProfile); 
          stopTracking(); 
         } 
        }; 
       } else { 
        mFragment.fbInfo(currentProfile.getId(), 
          currentProfile.getName(), mFbEmail); 
       } 
      } catch (JSONException ex) { 
       mFragment.loginFailed("Could not log in to FaceBook."); 
      } 
     } 
    }; 

} 

我發現在另一篇這種解決方案

您可以使用下面的代碼在活動和片段,以及。當在片段中使用 時,請確保您在ShareDialog構造函數中傳遞此值。 如果你傳遞getActivity(),那麼onActivityResult方法將不會被 在Fragment中觸發。

我試着將「mFragment.getActivity()」更改爲「this」和「FacebookSocialSelector.this」,但是我得到了一個connot解析構造函數錯誤。

編輯:如果我使用shareDialog(mFragment)或shareDialog(fragment),程序編譯正常,但我仍然沒有收到回調。我嘗試添加調試日誌記錄,但沒有一個被觸發。

+0

根據這不是一個錯誤,它應該保持這種方式。 要知道用戶是否接受發佈的唯一方法是檢查結果的postID。 如果用戶未取消AND,並且用戶已登錄到您的應用程序並且具有發佈權限,則只有一個postID。否則它將始終爲空。 是的,我知道,它很糟糕。 – Dhiyaneshwaran

+0

@Dhiyaneshwaran你有沒有參考這是一個錯誤? –

+0

請參閱此頁:https://stackoverflow.com/questions/30560363/android-facebook-sdk-share-dialog-does-not-respond-to-cancel-callback – Dhiyaneshwaran

回答

2

我懷疑mCallbackManager沒有調用onActivityResult(),因此您在ShareDialog的註冊回調中不會收到任何結果。首先嚐試調用new ShareDialog(mFragment);代替new ShareDialog(mFragment.getActivity());然後,在你ShareFragment類(我假設是mFragment)覆蓋onActivityResult(requestCode, resultCode, data)和做這樣的事情:

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

mFacebookSocialSelector指向您FacebookSocialSelector類的一個實例。裏面你FacebookSocialSelector類中創建一個公共方法,像這樣:

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    mCallbackManager.onActivityResult(requestCode, resultCode, data); 
} 

並希望onSuccess將被調用,一旦你發佈你的帖子。

相關問題