アクティビティ:
public class FrameActivity extends BaseActivity {
public static CallbackManager callbackManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
// FacebookSdk.sdkInitialize is called in the Application onCreate
callbackManager = CallbackManager.Factory.create();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
}
断片:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_login, container, false);
LoginButton loginButton = (LoginButton) view.findViewById(R.id.login_button);
loginButton.setReadPermissions("user_friends");
loginButton.setReadPermissions("public_profile");
loginButton.setReadPermissions("email");
loginButton.setReadPermissions("user_birthday");
// If using in a fragment
loginButton.setFragment(this);
// Other app specific specialization
// Callback registration
loginButton.registerCallback(FrameActivity.callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
}
@Override
public void onCancel() {
// App code
}
@Override
public void onError(FacebookException exception) {
// App code
}
});
return view;
}
これを試して:
フラグメントのFacebookSdk.sdkInitialize()
のonCreateView()
を初期化します。
次の行init callbackManager = CallbackManager.Factory.create()
;
FragmentクラスのonActivityResult()
に実装します。
callbackManager.onActivityResult(requestCode, resultCode, data);
をフラグメントonActivityResult()
に追加します。
アクティビティからFacebookInit()
とcallbackManager
を必ず削除してください。
loginButton.setFragment(this);
この行はすでに問題になっています。しかし、見過ごしている他の開発者のためにこれを書きたかっただけです。
フラグメントでFBログインボタンを使用している場合は、これをonCreateViewメソッドに追加してください。これにより、コールバックはアクティビティに行くのではなく、フラグメントに行きます。
古いバージョンの場合:
メソッドを次のように変更します。
_ @Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK)
{
com.facebook.Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
else
{
com.facebook.Session.getActiveSession().closeAndClearTokenInformation();
}
}
_
更新:v2.3の場合、 ここ :から
アクティビティまたはフラグメントのonCreate()メソッドにコールバックを追加します。
_@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(this.getApplicationContext());
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
}
@Override
public void onCancel() {
// App code
}
@Override
public void onError(FacebookException exception) {
// App code
}
});
}
_
ログインに成功すると、LoginResult
パラメーターに新しいAccessToken
と、最後に許可または拒否されたアクセス許可が設定されます。
ログインに成功するためにregisterCallbackは必要ありません。現在のアクセストークンの変更に従うには、以下で説明するAccessTokenTracker
クラスを使用できます。
次に、onActivityResult()
で、ログイン結果をonCreate()
で作成されたcallbackManager
に転送します。
_@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
_
FacebookSDK LoginまたはShareと統合するすべてのアクティビティとフラグメントは、onActivityResult
をcallbackManagerに転送する必要があります。
また、2つの異なる操作(ログインや共有など)に2つのコールバックマネージャーがある場合、onActivityResultを受け取る最初のコールバックマネージャーが2番目のコールバックを受け取り、その逆も可能であることも考慮してください。この動作により、コールバックが呼び出されないこともあります。
これは私のために働いた
コールバックマネージャーの初期化
CallbackManager sCallbackManager = CallbackManager.Factory.create();
コールバックを登録するメソッドを作成します
private void configureFacebookAppInviteCallBack(){
AppInviteDialog appInviteDialog = new AppInviteDialog(InviteHomeFragment.this);
appInviteDialog.registerCallback(sCallbackManager,
new FacebookCallback<AppInviteDialog.Result>() {
@Override
public void onSuccess(AppInviteDialog.Result result) {
Log.d("rht", "Invitation Sent Successfully");
CommonUtils.getInstance().showToast("50");
}
@Override
public void onCancel() {
Log.d("rht", "Error Occured in facebook invite ");
}
@Override
public void onError(FacebookException e) {
if(e!=null) {
Log.d("rht", "Error Occured in facebook invite ");
}else{
Log.d("rht", "Error Occured in facebook invite");
}
}
});
}
OnActivityResultを実装します。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.v("rht", "onActivityResult called requestCode "+requestCode+" resultCode "+resultCode);
sCallbackManager.onActivityResult(requestCode, resultCode, data);
}
フラグメント内でこれが重要な場合loginButton.setFragment(this);
Facebook APIの使用について誤解していることを理解するために、約3時間を費やしました。
_ void someInitCode() {
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
callAPI();
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException exception) {
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (AccessToken.getCurrentAccessToken() != null) callAPI();
else callbackManager.onActivityResult(requestCode, resultCode, data);
} else {
Log.d("hole", "not ok");
}
super.onActivityResult(requestCode, resultCode, data);
}
_
元の呼び出しはonSuccess()
コードを別の関数callAPI()
に入れなかったため、すでにログインに成功していてもAPIを呼び出すことはありません。その理由は、ログインおよび再ログインがonSuccess()
内に入らないためです!
私が見つけた回避策は、アクセストークンをチェックし、callAPI()
とonSuccess()
の両方でonActivityResult()
への呼び出しを分離することです。