![](/img/trans.png)
[英]Android Facebook SDK, how to open session without login form
[英]Facebook Android SDK does not open Session after login
1)這個問題出現了很多次,並且出現問題的人總是“您有錯誤的密鑰哈希”。
2)Facebook文檔告訴我們使用此代碼來獲取我們的密鑰哈希:
keytool -exportcert -alias MyKeyAlias -keystore path\to\my\Key | openssl sha1 -binary | openssl base64
3)好吧,這給了我那個鑰匙:1yl ********** Q3A
當我嘗試登錄時,收到以下消息:com.facebook.http.protocol.ApiException:(#404)密鑰哈希XHA ********** q10與任何存儲的密鑰哈希都不匹配。
4)然后,我將XHA ********** q10復制並粘貼到我的應用程序設置中,這也不是我的密鑰。
5)因此,我閱讀了文檔,該文檔是為您提供正確的密鑰哈希的代碼。 這段代碼:
// Add code to print out the key hash
try {
PackageInfo info = getPackageManager().getPackageInfo(
"com.facebook.samples.hellofacebook",
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));
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
有效! 給我這個哈希值:+ HA ********** q0 =
6)我將最后一個哈希值放在應用程序設置上,是,現在我可以連接了! 但是,現在我無法打開會話!!!
我正在使用以下代碼:
public class FBActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_view);
System.out.println("Start Facebook login");
Session.openActiveSession(this, true, new Session.StatusCallback() {
public void call(Session session, SessionState state,
Exception exception) {
System.out.println("Call");
if (session.isOpened()) {
System.out.println("Open");
Request.newMeRequest(session, new Request.GraphUserCallback() {
public void onCompleted(GraphUser user, Response response) {
System.out.println("Complete");
if (user != null) {
System.out.println(user.getName());
} else {
System.out.println("User NULL");
}
}
}).executeAsync();
} else {
System.out.println("Not open");
}
});
}
}
日志是:
“開始Facebook登錄
呼叫
沒開
呼叫
沒開”
我不知道還能做什么,因為我已經有了正確的密鑰哈希並且可以進行登錄了。
我想到了:
缺少以下方法。 剛添加它,一切正常。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
正在反復撥打電話(通過單擊相同的登錄按鈕)。 如果是,則第一次打開Facebook對話框后(第一次單擊登錄bttn將打開fbk對話框,但此后不會打開)原因:因為創建了會話且未清除會話,即未在幫助下注銷人您可以在此會話中獲取fbk用戶的個人資料信息。
如果您想這樣做,也可以編寫以下代碼行:
Session session = Session.getActiveSession();
if (session != null && session.isOpened()) {
Toast.makeText(getApplicationContext(), "session is opened",
Toast.LENGTH_LONG).show();
/* clear session and again click will show facebook login */
session = Session.getActiveSession();
if (!session.isClosed()) {
session.closeAndClearTokenInformation();
}
}
清除令牌后,立即進行登錄通話
FacebookAuthentication();
private void FacebookAuthentication() {
// Toast.makeText(getApplicationContext(),
// "new session was created and requires login", Toast.LENGTH_LONG)
// .show();
Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);
OpenRequest op = new Session.OpenRequest(SignUpActivity.this);
op.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
op.setCallback(statusCallback);
op.setPermissions(Arrays.asList("email", "public_profile"));
Session session = new Session.Builder(getApplicationContext()).build();
Session.setActiveSession(session);
session.openForRead(op);
}
全球宣告
private Session.StatusCallback statusCallback = new SessionStatusCallback();.
//無法訪問私人電子郵件
private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(final Session session, SessionState state,
Exception exception) {
if (session.isOpened()) {
makeFacebookMeRequest(session);
}
}
}
public void makeFacebookMeRequest(final Session session) {
Request.newMeRequest(session, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
String access_token = session.getAccessToken();
Log.d("Response", "Response=" + response);
Log.d("AccessToken", access_token);
UserId_FromFacebook = user.getId();
UserName_FromFacebook = user.getUsername();
FirstName_FromFacebook = user.getFirstName();
LastName_FromFacebook = user.getLastName();
try {
Email_FromFacebook = user.asMap().get("email")
.toString();
// Toast.makeText(getApplicationContext(),
// "" + Email_FromFacebook, Toast.LENGTH_LONG)
// .show();
} catch (Exception e) {
// e.printStackTrace();
}
}
//You can move to your activiy here and make sure user is signed up using your api
}
}).executeAsync();
}
////////////////在您的代碼中應用此補丁:只需在下面的方法中取消我的代碼的注釋即可)//////////////////////
private void LoginAndFetchFacebookProfileInfo() {
Session currentSession = Session.getActiveSession();
if (currentSession == null || currentSession.getState().isClosed()) {
Session session = new Session(getApplicationContext());
Session.setActiveSession(session);
currentSession = session;
}
if (currentSession.isOpened()) {
//you are logged in so do whatever you want
// Toast.makeText(SignUpActivity.this, "session is opened",
// Toast.LENGTH_LONG).show();
makeFacebookMeRequest(currentSession);
// Session session = Session.getActiveSession();
// if (session != null && session.isOpened()) {
//
// Toast.makeText(getApplicationContext(), "session is opened",
// Toast.LENGTH_LONG).show();
//
// /* clear session and again click will show facebook login */
//
// session = Session.getActiveSession();
// if (!session.isClosed()) {
// session.closeAndClearTokenInformation();
// }
//
// }
//
// FacebookAuthentication();
} else if (!currentSession.isOpened()) {
// Ask for username and password
// Toast.makeText(SignUpActivity.this, "session is not opened",
// Toast.LENGTH_LONG).show();
FacebookAuthentication();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.