我尝试使用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);
}
}
答案 0 :(得分:2)
可能有很多原因:
错误的密钥哈希。从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应用程序设置中输入。
打开Facebook原生应用,确保您已正确登录并可以访问内容。如果您在Facebook本机应用程序中输入了不正确的凭据(可能您最近更改了密码),那么Facebook SDK将反复尝试使用本机应用程序执行SSO并报告CLOSED_LOGIN_FAILED
。
如果您在沙盒模式下使用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开发者控制台正在跟踪用户的会话。试试吧!