通过Android的应用程序不能访问Facebook好友 [英] Can not access Facebook friends via Android application

查看:125
本文介绍了通过Android的应用程序不能访问Facebook好友的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我通过我的Andr​​oid应用程序获取用户的朋友们的JSONObject访问图形API的一个问题,提取他们的名字,并在屏幕上显示出来。它应该是一个简单明了的任务,但显然事实并非如此。当我跑我在Android的Nexus我的应用程序,我登录到Facebook的,那么我问我点击允许按钮,授予权限,我重定向到一个空白页。我希望看到我的朋友的名字,但它不会发生。能有人帮助我。

 公共类登录扩展活动
{
    Facebook的mFacebook =新的Facebook(201509899926116);
    AsyncFacebookRunner mAsyncRunner =新AsyncFacebookRunner(mFacebook);
    字符串文件名=AndroidSSO_data;
    私人共享preferences米preFS;
    查看的LinearLayout;

    @覆盖
    公共无效的onCreate(包savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main);
        的LinearLayout = findViewById(R.id.main_layout);

         / *获取现有access_token如有* /
        米preFS = GET preferences(MODE_PRIVATE);
        字符串access_token = M prefs.getString(access_token,NULL);
        长过期= M prefs.getLong(access_expires,0);

        若(access_token!= NULL)
        {
            mFacebook.setAccessToken(access_token);
        }
        如果(到期!= 0)
        {
            mFacebook.setAccessExpires(到期);
        }

        / *只有调用授权,如果access_token已过期。 * /
        如果(!mFacebook.isSessionValid())
        {
            mFacebook.authorize(这一点,新的String [] {user_birthday,电子邮件,
                  user_relationships,user_religion_politics,user_hometown,
                  user_location,user_relationship_details,user_education_history,
                  user_likes,user_interests,user_activities},
                  新DialogListener()
            {

                @覆盖
                公共无效的onComplete(束值)
                {
                    共享preferences.Editor编辑= M prefs.edit();
                    editor.putString(access_token,mFacebook.getAccessToken());
                    editor.putLong(access_expires,mFacebook.getAccessExpires());
                    editor.commit();

                    / *访问的图形API * /
                    Log.d(脸谱 - 示例 - 好友请求,入门API请求);
                    mAsyncRunner.request(我的/朋友,新FriendsRequestListener());
                    Log.d(脸谱 - 示例 - 好友请求,已完成API请求);
                }

                @覆盖
                公共无效onFacebookError(FacebookError错误){}

                @覆盖
                公共无效onerror的(DialogError E){}

                @覆盖
                公共无效OnCancel的(){}
            });
        }
    }

    @覆盖
    公共无效onActivityResult(INT申请code,INT结果code,意图数据)
    {
        super.onActivityResult(要求code,因此code,数据);
        mFacebook.authorizeCallback(要求code,因此code,数据);
    }

    公共类FriendsRequestListener实现com.facebook.android.AsyncFacebookRunner.RequestListener
    {
        / **
         *调用时得到朋友的请求已经完成。
         *检索和分析,并显示JSON流。
         * /
        公共无效的onComplete(最后弦乐响应)
        {
            尝试
            {
                //过程中,这里的响应:在后台线程中执行
                Log.d(脸谱 - 示例 - 好友请求,response.length():+ response.length());
                Log.d(脸谱 - 示例 - 好友请求,回应:+响应);

                最后的JSONObject JSON =新的JSONObject(响应);
                JSONArray D = json.getJSONArray(数据);
                int类型l =(D =空d.length():!?0);
                Log.d(脸谱 - 示例 - 好友请求,d.length():+ 1);

                的for(int i = 0; I<升;我++)
                {
                    JSONObject的O = d.getJSONObject(我);
                    字符串n = o.getString(姓名);
                    字符串ID = o.getString(ID);

                    TextView的电视=新的TextView(Login.this);
                    tv.setText(N);
                    ((的LinearLayout)的LinearLayout).addView(TV);
                }
            }
            赶上(JSONException E)
            {
                Log.w(脸谱 - 示例,在JSON的错误反应);
            }
        }
    }
}
 

解决方案

我想我可能已经找到了问题。根据对onComplet文档;

  / **
     *当给定响应的请求完成后调用。
     *
     *通过执行的后台线程:不更新该方法的UI。
     * /
 

和您要更新的用户界面,所以addViews实际上并未体现在UI线程。您应该建立在性的方法,你可以用的onComplete调用runOnUIThread ..这样的事情;

  runOnUiThread(新的Runnable(){
            公共无效的run(){
                inserFacebookNames(facebookContactNames);
            }
        });
 

让我知道如果这实际上修复它。我很好奇,如果是这样的原因。

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

解决方案

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..

这篇关于通过Android的应用程序不能访问Facebook好友的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆