2011-11-16 26 views
6

ユーザーの友人をJSONObjectとして取得し、その名前を抽出して画面に表示するAndroidアプリケーションを通じてグラフAPIにアクセスする際に問題があります。それは単純で直接的な仕事であるはずですが、明らかにそうではありません。 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. 
    */ 

そしてaddViewsが実際にUIスレッドには反映されませんので、あなたは、あなたのUIを更新しようとしている..あなたは、あなたがrunOnUIThreadでonCompleteのから呼び出すことができ、あなたの活動の方法を作成する必要があります。..ような何かこの;

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

デバッグしているとき

+0

ありがとうございます。修正されました! – NewToAndroid

+0

おそらく、あなたはこの回答を受け入れたものとしてマークするべきでしょうか?緑色のチェックマークをクリックすると、これを行うことができます。 – Silox

関連する問題