facebook登录失败:{会话状态:CLOSED_LOGIN_FAILED,令牌:{AccessToken令牌:ACCESS_TOKEN_REMOVED权限:[]},appId:131 *** 64547}

时间:2014-04-13 17:47:18

标签: java android facebook login facebook-login

我尝试使用fb。

执行此代码登录我的应用
public class FacebookLogin2Activity extends BaseActivity {

    private String TAG = "MainActivity";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.facebook_login);

        Session session = Session.getActiveSession();
        if (session != null && session.isOpened()) {
            fetchUserDetails(session);
        }

        LoginButton authButton = (LoginButton) findViewById(R.id.authButton);
        authButton.setOnErrorListener(new OnErrorListener() {

            @Override
            public void onError(FacebookException error) {
                Log.e(TAG, "Error " + error.getMessage());
            }
        });
        // set permission list, Don't forget to add email
        authButton.setReadPermissions(Arrays.asList("basic_info", "email",
                "birthday"));

        // option A
        // Session.openActiveSession(this, true, new Session.StatusCallback() {
        //
        // // callback when session changes state
        // @Override
        // public void call(Session session, SessionState state,
        // Exception exception) {
        // fetchUserDetails(session);
        // }
        // });

        // // option B
        // session state call back event
        authButton.setSessionStatusCallback(new Session.StatusCallback() {

            @Override
            public void call(Session session, SessionState state,
                    Exception exception) {

                if (session.isOpened()) {
                    fetchUserDetails(session);
                }
            }
        });
    }

    private void fetchUserDetails(Session session) {
        Log.i(TAG, "Access Token" + session.getAccessToken());

        Request.newMeRequest(session, new Request.GraphUserCallback() {
            @Override
            public void onCompleted(GraphUser user, Response response) {
                //some code
                }
            }

        }).executeAsync();
    }

但我收到此错误

我应该检查什么?

{Session state:CLOSED_LOGIN_FAILED, token:{AccessToken token:ACCESS_TOKEN_REMOVED permissions:[]}, appId:131390430364547}

我已经验证了Facebook开发者在网站上有我的安卓哈希码。

public class MainActivity extends Activity {

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // start Facebook Login
    Session.openActiveSession(this, true, new Session.StatusCallback() {

      // callback when session changes state
      @Override
      public void call(Session session, SessionState state, Exception exception) {
        if (session.isOpened()) {

          // make request to the /me API
          Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

            // callback after Graph API response with user object
            @Override
            public void onCompleted(GraphUser user, Response response) {
              if (user != null) {
                TextView welcome = (TextView) findViewById(R.id.welcome);
                welcome.setText("Hello " + user.getName() + "!");
              }
            }
          });
        }
      }
    });
  }

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

}

2 个答案:

答案 0 :(得分:2)

可能有很多原因:

  1. 错误的密钥哈希。从facebook提供的代码中生成一个:

    PackageInfo info = getPackageManager().getPackageInfo("<your_package_name>",  PackageManager.GET_SIGNATURES);
    
    for (Signature signature : info.signatures){
       MessageDigest md = MessageDigest.getInstance("SHA");
       md.update(signature.toByteArray());
       Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
    }
    

    确保将"<your_package_name>"替换为相应的包名称。查看logcat并抓住keyhash并在你的facebook应用程序设置中输入。

  2. 打开Facebook原生应用,确保您已正确登录并可以访问内容。如果您在Facebook本机应用程序中输入了不正确的凭据(可能您最近更改了密码),那么Facebook SDK将反复尝试使用本机应用程序执行SSO并报告CLOSED_LOGIN_FAILED

  3. 如果您在沙盒模式下使用Facebook应用程序,请确保您使用的帐户位于授权管理员或开发人员列表中。

答案 1 :(得分:1)

检查您的Manifest.xml

 <meta-data android:value="@string/facebook_app_id" android:name="com.facebook.sdk.ApplicationId"/>

并且你的strings.xml有

  <string name="facebook_app_id">131390430364547</string>

验证您的Facebook应用配置中的app_id是否相同,并设置&#34; yourApp.mainactivity&#34;在类字段中

它是debbug应用程序还是已发布的应用程序?每个哈希码都不同

已修改 *

用于验证会话的状态

private Session.StatusCallback callback = new Session.StatusCallback() {

    @Override
    public void call(Session session, SessionState state, Exception exception) {
        onSessionStateChange(session, state, exception);
        if (session.isOpened()) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
          Log.e("user", "session established");
            Request.newMeRequest(session, new Request.GraphUserCallback() {

                @Override
                public void onCompleted(GraphUser user, Response response) {
                    if (user != null) {
                    Log.e("user", "loged user");
                        buildUserInfoDisplay(user);
                    }
                }
            }).executeAsync();
        }
        else{
          Log.e("user", "session not established");
        }
    }
    private void onSessionStateChange(Session session, SessionState state,
                                      Exception exception) {

    }
};

并在on create方法中使用登录按钮

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
            .permitAll().build();

        StrictMode.setThreadPolicy(policy);
        uiHelper = new UiLifecycleHelper(this, callback);
        uiHelper.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        buttonLoginLogout = (LoginButton)findViewById(R.id.authButton);
        buttonLoginLogout.setReadPermissions(Arrays.asList("user_status"));

    }

}

还需要管理al lifecycle methods中的ui状态

public void onResume() {
    super.onResume();
    uiHelper.onResume();
}
 public void onPause() {
    super.onPause();
    uiHelper.onPause();
}

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

@Override
public void onDestroy() {
    super.onDestroy();
    uiHelper.onDestroy();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    uiHelper.onSaveInstanceState(outState);
}

我有一个这个登录的应用程序正如我发布它,它恶劣,Facebook开发者控制台正在跟踪用户的会话。试试吧!

相关问题