2011-11-16 101 views
6

我通過我的android應用程序訪問圖API時遇到問題,該應用程序檢索用戶的朋友爲JSONObject,提取他們的名字並將其顯示在屏幕上。它應該是一個簡單而直接的任務,但顯然它不是。當我在Android Nexus I上運行我的應用程序時,我登錄到Facebook,然後詢問我單擊「允許」按鈕授予權限,然後重定向到空白頁面。我期望看到我的朋友的名字,但它不會發生。有人能幫助我嗎?無法通過Android應用程序訪問Facebook朋友

public class Login extends Activity 
{ 
    Facebook mFacebook = new Facebook("201509899926116"); 
    AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(mFacebook); 
    String FILENAME = "AndroidSSO_data"; 
    private SharedPreferences mPrefs; 
    View linearLayout; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     linearLayout = findViewById(R.id.main_layout); 

     /* Get existing access_token if any */ 
     mPrefs = getPreferences(MODE_PRIVATE); 
     String access_token = mPrefs.getString("access_token", null); 
     long expires = mPrefs.getLong("access_expires", 0); 

     if(access_token != null) 
     { 
      mFacebook.setAccessToken(access_token); 
     } 
     if(expires != 0) 
     { 
      mFacebook.setAccessExpires(expires); 
     } 

     /* Only call authorize if the access_token has expired. */ 
     if(!mFacebook.isSessionValid()) 
     { 
      mFacebook.authorize(this, new String[] {"user_birthday","email", 
        "user_relationships","user_religion_politics","user_hometown", 
        "user_location","user_relationship_details","user_education_history", 
        "user_likes","user_interests", "user_activities"}, 
        new DialogListener() 
      { 

       @Override 
       public void onComplete(Bundle values) 
       { 
        SharedPreferences.Editor editor = mPrefs.edit(); 
        editor.putString("access_token", mFacebook.getAccessToken()); 
        editor.putLong("access_expires", mFacebook.getAccessExpires()); 
        editor.commit(); 

        /* access the graph API */ 
        Log.d("Facebook-Example-Friends Request", "Started API request"); 
        mAsyncRunner.request("me/friends", new FriendsRequestListener()); 
        Log.d("Facebook-Example-Friends Request", "Finished API request"); 
       } 

       @Override 
       public void onFacebookError(FacebookError error) {} 

       @Override 
       public void onError(DialogError e) {} 

       @Override 
       public void onCancel() {} 
      }); 
     } 
    } 

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

    public class FriendsRequestListener implements com.facebook.android.AsyncFacebookRunner.RequestListener 
    { 
     /** 
     * Called when the request to get friends has been completed. 
     * Retrieve and parse and display the JSON stream. 
     */ 
     public void onComplete(final String response) 
     { 
      try 
      { 
       // process the response here: executed in background thread 
       Log.d("Facebook-Example-Friends Request", "response.length(): " + response.length()); 
       Log.d("Facebook-Example-Friends Request", "Response: " + response); 

       final JSONObject json = new JSONObject(response); 
       JSONArray d = json.getJSONArray("data"); 
       int l = (d != null ? d.length() : 0); 
       Log.d("Facebook-Example-Friends Request", "d.length(): " + l); 

       for (int i=0; i<l; i++) 
       { 
        JSONObject o = d.getJSONObject(i); 
        String n = o.getString("name"); 
        String id = o.getString("id"); 

        TextView tv = new TextView(Login.this); 
        tv.setText(n); 
        ((LinearLayout) linearLayout).addView(tv); 
       }    
      } 
      catch (JSONException e) 
      { 
       Log.w("Facebook-Example", "JSON Error in response"); 
      } 
     } 
    } 
} 
+0

當你調試,它實際上擊中了好友請求偵聽器的onComplete回調方法? –

+0

嘿,如果我的回答有助於解決問題,您應該將其標記爲已接受的答案(點擊答案旁邊的複選標記) –

回答

2

我想我可能已經發現了這個問題..根據關於onComplet的文檔;

 /** 
    * Called when a request completes with the given response. 
    * 
    * Executed by a background thread: do not update the UI in this method. 
    */ 

而且你要更新你的UI,所以addViews不着手在UI線程上體現。您應該建立在你的活性的方法,你可以從使用的onComplete調用runOnUIThread ..喜歡的東西這個;

runOnUiThread(new Runnable() { 
      public void run() { 
       inserFacebookNames(facebookContactNames); 
      } 
     }); 

讓我知道如果這實際上修復它。我很好奇,如果是這樣的原因..

+0

謝謝您的回覆。它是固定的! – NewToAndroid

+0

也許你應該把這個答案標記爲接受呢?您可以通過點擊綠色的複選標記來完成。 – Silox

相關問題