2014-09-20 139 views
0

我正在嘗試將facebook登錄集成到我的應用中。我在facebook開發人員網站上閱讀了文檔,但它不適用於我。這裏是我的源代碼:Android Facebook身份驗證失敗

import android.content.Intent; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.text.TextUtils; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 
import com.facebook.Request; 
import com.facebook.Response; 
import com.facebook.Session; 
import com.facebook.SessionState; 
import com.facebook.model.GraphUser; 
import com.superteam.altt.R; 
import com.superteam.altt.common.Constants; 
import com.superteam.altt.utils.ToastUtil; 

public class LoginActivity extends BaseActivity implements View.OnClickListener { 

private Button btnFblogin; 
private Button btnGoogleLogin; 

/** 
* Facebook instances 
*/ 
private Session.StatusCallback statusCallback = new OnSessionStatusChangedCallback(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 
    findViews(); 
} 

private void findViews() { 
    btnFblogin = (Button) findViewById(R.id.btn_login_facebook); 
    btnGoogleLogin = (Button) findViewById(R.id.btn_login_google); 

    btnFblogin.setOnClickListener(this); 
    btnFblogin.setOnClickListener(this); 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.login, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

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

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.btn_login_facebook: 
      logInViaFacebook(); 
      break; 
     case R.id.btn_login_google: 
      break; 
     default: 

    } 
} 

private void logInViaFacebook() { 
    startFacebookSession(); 

} 

private void startFacebookSession() { 
    Session session = Session.getActiveSession(); 
    if (session != null && !session.isOpened() && !session.isClosed()) { 
     openSession(session); 
    } else { 
     Session.openActiveSession(this, true, statusCallback); 
    } 
} 

private void openSession(Session session) { 
    Session.OpenRequest openRequest = new Session.OpenRequest(this); 
    openRequest.setPermissions(Constants.FACEBOOK_PERMISSIONS); 
    session.openForRead(openRequest); 
} 


private class OnSessionStatusChangedCallback implements Session.StatusCallback { 

    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     if (session != null && session.isOpened() && !TextUtils.isEmpty(session.getAccessToken())) { 
      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) { 
         Intent intent = new Intent(getApplicationContext(),HomeActivity.class); 
         startActivity(intent); 
         Toast.makeText(getApplicationContext(),"Hello" + user.getUsername(),Toast.LENGTH_SHORT).show(); 
        } else { 
         Toast.makeText(getApplicationContext(),"Login failed",Toast.LENGTH_SHORT).show(); 
        } 
       } 
      }); 
     } 
    } 
} 

} 

吐司總是顯示「登錄失敗」。任何人都可以幫我解決這個問題?

回答

0
private Session.StatusCallback statusCallback = new FBSessionStatus(); 

public void setupFacebookConnect(Bundle savedInstanceState) { 
    Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); 

    Session session = Session.getActiveSession(); 
    if (session == null) { 
     if (savedInstanceState != null) { 
      session = Session.restoreSession(this, null, statusCallback, 
        savedInstanceState); 
     } 
     if (session == null) { 
      session = new Session(this); 
     } 
     Session.setActiveSession(session); 
     if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) { 
      session.openForRead(new Session.OpenRequest(this) 
        .setCallback(statusCallback)); 
     } 
    } 
} 

public boolean isFacebookConnected() { 
    Session session = Session.getActiveSession(); 
    return (session.isOpened()) ? true : false; 
} 

public void connectFacebook() { 
    Session session = Session.getActiveSession(); 
    if (!session.isOpened() && !session.isClosed()) { 
     session.openForRead(new Session.OpenRequest(this) 
       .setCallback(statusCallback)); 
    } else { 
     Session.openActiveSession(this, true, statusCallback); 
    } 
} 

/* @Override 
public void onStart() { 
    super.onStart(); 
    Session.getActiveSession().addCallback(statusCallback); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    Session.getActiveSession().removeCallback(statusCallback); 
}*/ 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    Session session = Session.getActiveSession(); 
    Session.saveSession(session, outState); 
} 

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

/* 
* private String buildUserInfoDisplay(GraphUser user) { StringBuilder 
* userInfo = new StringBuilder(""); 
* 
* // Example: typed access (name) // - no special permissions required 
* userInfo.append(String.format("Name: %s\n\n", user.getName())); 
* 
* 
* 
* 
* // Example: typed access (birthday) // - requires user_birthday 
* permission 
* 
* userInfo.append(String.format("Birthday: %s\n\n", user.getBirthday())); 
* 
* userInfo.append(String.format("PHone: : %s\n\n", 
* user.getProperty("phone"))); 
* 
* // Example: partially typed access, to location field, // name key 
* (location) // - requires user_location permission 
* userInfo.append(String.format("Location: %s\n\n", user.getLocation() 
* .getProperty("name"))); 
* 
* userInfo.append(String.format("Email: : %s\n\n", 
* user.getProperty("email"))); 
* 
* // Example: access via property name (locale) // - no special permissions 
* required userInfo.append(String.format("Locale: %s\n\n", 
* user.getProperty("locale"))); 
* 
* // Example: access via key for array (languages) // - requires user_likes 
* permission JSONArray languages = (JSONArray) 
* user.getProperty("languages"); if (languages.length() > 0) { 
* ArrayList<String> languageNames = new ArrayList<String>(); for (int i = 
* 0; i < languages.length(); i++) { JSONObject language = 
* languages.optJSONObject(i); // Add the language name to a list. Use JSON 
* // methods to get access to the name field. 
* languageNames.add(language.optString("name")); } 
* userInfo.append(String.format("Languages: %s\n\n", 
* languageNames.toString())); } 
* 
* return userInfo.toString(); } 
*/ 

public class FBSessionStatus implements Session.StatusCallback { 
    @Override 
    public void call(Session session, SessionState state, 
      Exception exception) { 
     if (state.isOpened()) { 

      Request.executeMeRequestAsync(session, 
        new Request.GraphUserCallback() { 

         @Override 
         public void onCompleted(GraphUser user, 
           Response response) { 
          if (user != null) { 
           // Display the parsed user info 
           fb_username = user.getName(); 
           fb_email = (String) user 
             .getProperty("email"); 

           new FB_Login().execute(); 
           // buildUserInfoDisplay(user); 
          } 
         } 
        }); 
     } else if (state.isClosed()) { 

     } 
    } 
} 

public void disConnectFacebook() { 
    Session session = Session.getActiveSession(); 
    if (!session.isClosed()) { 
     session.closeAndClearTokenInformation(); 
    } 
} 

如果它是有用的你請投

+0

謝謝。但是我仍然無法獲得用戶,它仍然是空的。我不知道這裏有什麼錯誤:( – 2014-09-20 17:19:41

0

我真的建議你使用SimpleFacebook庫。我開始使用Facebook SDK,但我意識到它有一個糟糕/複雜的軟件設計。

如果你想正確使用它,你必須先花時間學習奇怪的概念。

SimpleFacebook這是Facebook應該做的。

只是爲了得到一個想法,有關如何執行任務登錄一個例子:

//初始化回調監聽:

OnLoginListener onLoginListener = new OnLoginListener() { 
    @Override 
    public void onLogin() { 
     // change the state of the button or do whatever you want 
     Log.i(TAG, "Logged in"); 
    } 

    @Override 
    public void onNotAcceptingPermissions(Permission.Type type) { 
     // user didn't accept READ or WRITE permission 
     Log.w(TAG, String.format("You didn't accept %s permissions", type.name())); 
    } 

    /* 
    * You can override other methods here: 
    * onThinking(), onFail(String reason), onException(Throwable throwable) 
    */ 
}; 

mSimpleFacebook.login(onLoginListener); 
+0

謝謝,但我使用的是android工作室,該lib不能在android studio導入。此外,我只想弄清楚我的源代碼中有什麼問題以及如何修復它。 – 2014-09-20 14:42:17