Androidアプリがあり、FacebookのSDK(バージョン4.1.0)を使用してトークンを取得してログインしようとしています。コードは次のとおりです。
_public class LoginActivity extends Activity {
private CallbackManager callbackManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
FacebookSdk.sdkInitialize(getApplicationContext());
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
AccessToken accessToken = loginResult.getAccessToken();
Log.v(TAG, "Facebook login was successful");
String authToken = accessToken.getToken();
// User authToken here:
}
@Override
public void onCancel() {
Log.v(TAG, "Facebook login was canceled");
}
@Override
public void onError(FacebookException e) {
Log.e(TAG, "Facebook login failed: " + e.getMessage());
}
});
Button facebook_button = (Button) findViewById(R.id.fbButton);
facebook_button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
LoginManager.getInstance().logInWithReadPermissions(getActivity(), Arrays.asList("public_profile"));
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
}
_
コードがFacebookアプリに切り替わり、元に戻ってOnActivityResult()
が呼び出されます。ただし、呼び出されるコールバックメソッドは常にonCancel()
です。 Facebookが提供するLoginButton
を使用しておらず、独自のボタンがあることに注意してください(ただし、そのアプローチを試したところ、結果は同じでした)。 アプリIDとアプリによって生成されたキーハッシュをダブルチェックとトリプルチェックしましたが、それらも正しく見えます。だから、私は他に何が間違っているのかわかりません。この時点での助けは大歓迎です。
はい私は同じ問題に直面していました、ログイン直前に以下のコードを使用してそれを解決しました
LoginManager.getInstance().logOut();
この動作の背後にある理由は、すでにログインしているためです。したがって、これを取り消すと、onsubmit()ではなくoncancel()が呼び出されます。したがって、このようにアプリケーションのログアウトボタンでログアウトを実行するだけです
インポート->
import com.facebook.login.LoginManager;
実装->
LoginManager.getInstance().logOut();
私も同じ問題を抱えていましたが、最終的に問題を見つけました。 Facebookのログインフラグメントを呼び出すアクティビティにはAndroid:launchMode="singleInstance"
マニフェストファイル内。
@Doruのコメントは私を解決策に導きます。フラグメントではなくFacebookアクティビティを使用しました。
の代わりに
<activity Android:name="com.facebook.FacebookActivity"
Android:screenOrientation="portrait"
Android:launchMode="singleTask" />
私は書く必要がありました
<activity Android:name="com.facebook.FacebookActivity"
Android:screenOrientation="portrait" />
このバグの厄介な点は、古いAndroidバージョン(5.0ではなく4.4.2など)でのみ発生することです。
@Override
public void onCancel() {
accessToken = AccessToken.getCurrentAccessToken();
if (accessToken == null) {
Toast.makeText(LoginActivity.this, "Login unSuccessful..Please contact developer... ", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(LoginActivity.this, "Login Successful. ", Toast.LENGTH_LONG).show();
}
}
@Override
public void onError(FacebookException error) {
Toast.makeText(getApplicationContext(), "Login attempt failed.", Toast.LENGTH_SHORT).show();
}
将来誰かがこれに遭遇した場合、これは、理由XのためにログインをブロックしているデバイスにインストールされたFacebookネイティブアプリが原因である可能性もあります。
私の場合、これはログインを試みるたびにスローされていました。ついにネイティブのFacebookアプリに切り替えましたが、開いたときに認証が必要で、「不審なアクティビティ」が原因で再度ログインしました(最近番号を変更したと思います)。
上記のすべてを実行していて、ユーザーがまだそれについて不満を言っている場合(そして、ユーザーがアプリをインストールしている場合は、下部のコードを使用して、Facebookアプリがインストールされているかどうかを確認できます:)次のダイアログを含めることができます。 Facebookアプリをチェックして、まだログインしていることを確認するように求めます。これにより、アプリケーションにタブで戻る前に、エラーを修正するように求められます。
//Code to check if Facebook app is installed:
public static boolean doesUserHaveFacebookAppInstalled(Context context){
try{
context.getPackageManager().getApplicationInfo("com.facebook.katana", 0 );
return true;
} catch( PackageManager.NameNotFoundException e ){
return false;
}
}
問題は、APPIDを二重引用符で囲む必要があるためです。