如何通过Facebook成功登录后获取用户详细信息

我试过这个:当isSessionValid getDetails直接在facebook.authorize然后在onActivityResult中获取getDetails

public class MainActivity extends Activity { Facebook facebook = new Facebook("xxxxxxxxxxxxxxxx"); AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook); private SharedPreferences mPrefs; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mPrefs = getPreferences(MODE_PRIVATE); String access_token = mPrefs.getString("access_token", null); long expires = mPrefs.getLong("access_expires", 0); if (access_token != null) { facebook.setAccessToken(access_token); } if (expires != 0) { facebook.setAccessExpires(expires); } if (!facebook.isSessionValid()) { facebook.authorize(this, new String[] {}, new DialogListener() { @Override public void onComplete(Bundle values) { SharedPreferences.Editor editor = mPrefs.edit(); editor.putString("access_token", facebook.getAccessToken()); editor.putLong("access_expires", facebook.getAccessExpires()); editor.commit(); } @Override public void onFacebookError(FacebookError error) { } @Override public void onError(DialogError e) { } @Override public void onCancel() { } }); }else{ try { JSONObject json = Util.parseJson(facebook.request("me")); String facebookID = json.getString("id"); String firstName = json.getString("first_name"); String lastName = json.getString("last_name"); String email = json.getString("email"); String gender = json.getString("gender"); } catch (Exception e) { } } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); facebook.authorizeCallback(requestCode, resultCode, data); try { JSONObject json = Util.parseJson(facebook.request("me")); String facebookID = json.getString("id"); String firstName = json.getString("first_name"); String lastName = json.getString("last_name"); String email = json.getString("email"); String gender = json.getString("gender"); } catch (Exception e) { } } public void onResume() { super.onResume(); facebook.extendAccessTokenIfNeeded(this, null); } } 

当我在我的系统上安装了facebook app时,这很好用。 但是如果没有安装,我会得到一个Web View来输入facebook凭据,而logcat显示login-success,但是没有一个getDetails块被调用。

这里在initFacebook()函数中通过你可以登录并执行你的function,这里我正在获取用户的朋友信息。

 private void initFacebook() { try { if (APP_ID == null) { Util.showAlert(this,"Warning","Facebook Applicaton ID must be "+ "specified before running this example: see Example.java"); } mFacebook = new Facebook(); mAsyncRunner = new AsyncFacebookRunner(mFacebook); mFacebook.authorize(FacebookList.this, APP_ID, new String[] {"email", "read_stream", "user_hometown", "user_location","friends_about_me", "friends_hometown", "friends_location","user_relationships", "friends_relationship_details","friends_birthday", "friends_education_history","friends_website" }, new DialogListener() { public void onComplete(Bundle values) { getHTTPConnection(); } public void onFacebookError(FacebookError error) { Log.i("public void onFacebookError(FacebookError error)....","...."); } public void onError(DialogError e) { Log.i("public void onError(DialogError e)....", "...."); CustomConfirmOkDialog dialog = new CustomConfirmOkDialog(FacebookList.this, R.style.CustomDialogTheme, Utils.FACEBOOK_CONNECTION_ERROR); dialog.show(); } public void onCancel() { Log.i("public void onCancel()....", "...."); } }); SessionStore.restore(mFacebook, this); SessionEvents.addAuthListener(new SampleAuthListener()); SessionEvents.addLogoutListener(new SampleLogoutListener()); } catch (Exception e) { e.printStackTrace(); } } 

这里的getHTTPConnection() ,继续连接和发送字段,我们需要关于用户的朋友,我们可以看到传递字段是fields=id,first_name,last_name,location,picture friends的fields=id,first_name,last_name,location,picture 。 在这里,您可以根据应用程序的要求更改此字段。

 private void getHTTPConnection() { try { mAccessToken = mFacebook.getAccessToken(); HttpClient httpclient = new DefaultHttpClient(); String result = null; HttpGet httpget = new HttpGet("https://graph.facebook.com/me/friends?access_token="+ mAccessToken + "&fields=id,first_name,last_name,location,picture"); HttpResponse response; response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); if (entity != null) { result = EntityUtils.toString(entity); parseJSON(result); } } catch (Exception e) { e.printStackTrace(); } } 

现在,在成功连接到facebook之后 ,我们将获取JSON数据并进一步解析它。

 private void parseJSON(String data1) throws Exception,NullPointerException, JSONException { try { JSONObject jObj = new JSONObject(data1); JSONArray jObjArr = jObj.optJSONArray("data"); int lon = jObjArr.length(); for (int i = 0; i < lon; i++) { JSONObject tmp = jObjArr.optJSONObject(i); String temp_image = tmp.getString("picture"); String temp_fname = tmp.getString("first_name"); String temp_lname = tmp.getString("last_name"); String temp_loc = null; JSONObject loc = tmp.getJSONObject("location"); temp_loc = loc.getString("name"); } } catch (Exception e) { Log.i("Exception1 is Here>> ", e.toString()); e.printStackTrace(); } } 

假设您已经将facebook jar添加到您的应用程序中,并且为了继续执行此代码,您可以将initFacebook()调用到您的活动的onCreate()