2017-06-23 29 views
1

私のアプリケーションをネイティブの共有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."); 
      } 
     } 
    }; 

} 

私は、あなたが同様の活動にとフラグメントに以下のコードを使用することができます...別のポストに

を、この解決策を見つけました。 Fragmentで を使用している場合、ShareDialogコンストラクタでこれを渡すようにしてください。 getActivity()を渡すと、onActivityResultメソッドはFragmentで がトリガーされません。

と私は「mFragment.getActivity()」を「本」と「FacebookSocialSelector.this」を変更しようとしましたが、私はconnotの解決のコンストラクタエラーが表示されます。

編集:shareDialog(mFragment)またはshareDialog(fragment)を使用するとプログラムが正常にコンパイルされますが、コールバックはまだ受信されません。デバッグロギングを追加しようとしましたが、トリガーされていません。

+0

これによれば、それはバグではなく、そのままにする必要があります。 ユーザーが公開を承認したかどうかを確認する唯一の方法は、結果のpostIDを確認することです。 ユーザーがキャンセルしなかった場合、およびユーザーがあなたのアプリにログインして公開権限を持っている場合にのみ、postIDを取得できます。それ以外の場合は、常にnullになります。 うん、わかっている、それは吸う。 – Dhiyaneshwaran

+0

@Dhiyaneshwaranあなたはこれがバグであることへの参照がありますか? –

+0

このページを参照してください:https://stackoverflow.com/questions/30560363/android-facebook-sdk-share-dialog-does-not-respond-to-cancel-callback – Dhiyaneshwaran

答えて

2

私はmCallbackManageronActivityResult()を呼び出していないと思うので、登録したShareDialogのコールバックで結果を受け取ることはできません。まず、(私はmFragmentであると仮定している)あなたのShareFragmentクラスで、そして、代わりにnew ShareDialog(mFragment.getActivity());new ShareDialog(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); 
} 

どこFacebookSocialSelectorクラスのインスタンスへmFacebookSocialSelectorポイント。

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

を、うまくいけばonSuccessはあなたの投稿を公開すると呼び出されます:あなたのFacebookSocialSelectorクラス内そうのように、パブリックメソッドを作成します。

関連する問題