Can not access Facebook friends via Android application

时光总嘲笑我的痴心妄想 提交于 2020-01-02 03:30:21

问题


I have a problem with accessing the graph API through my android application that retrieves a user's friends as JSONObject, extracts their names and displays them on the screen. It is supposed to be a simple and straightforward task but apparently it is not. When I run my application on Android Nexus I, I login to Facebook, then I am asked I click "Allow" button to grant permissions and I am redirected to a blank page. I am expect to see the name of my friends but it does not happen. Could some one assist me.

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");
            }
        }
    }
}

回答1:


I think i might've found the issue.. According to the documentation on onComplet;

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

And you are trying to update your UI, so addViews don't actually get reflected on the UI thread.. You should create a method in your activity that you can call from onComplete with runOnUIThread.. Something like this;

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

Let me know if this actually fixes it.. I'm curious if that was the reason..



来源:https://stackoverflow.com/questions/8156615/can-not-access-facebook-friends-via-android-application

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!