安卓 Facebook Graph API 基本信息请求

4

我试图让我的应用程序从经过身份验证的Facebook用户那里获取基本信息,但是我的logcat告诉我:

06-30 16:37:27.969: WARN/System.err(1559): com.facebook.android.FacebookError: 必须使用活动访问令牌来查询有关当前用户的信息。

在代码运行的认证后面。有人能指点我正确的方向吗?我看到一个非常类似的帖子,有人使用几乎相同的代码,它可以工作。

谢谢

Facebook facebook = new Facebook("187212574660004");

TextView nText;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    nText = (TextView) this.findViewById(R.id.nameText);

    facebook.authorize(this, new String[] {"offline_access", "user_interests", "friends_interests"},

            new DialogListener() {
        public void onComplete(Bundle values) {
            setContentView(R.layout.homepage);
        }

        public void onFacebookError(FacebookError error) {}

        public void onError(DialogError e) {}

        public void onCancel() {}
    });

    JSONObject json_data = null;

    try
    {
        JSONObject response = Util.parseJson(facebook.request("me/friends")); // Get a friend information from facebook
        JSONArray jArray = response.getJSONArray("data");

        json_data = jArray.getJSONObject(0);
        String name = json_data.getString("name");
        Log.i("friend is", name);
        nText.setText(name);

    }
    catch (MalformedURLException e)
    {
        e.printStackTrace();
    }
    catch (JSONException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    catch (FacebookError e)
    {
        e.printStackTrace();
    }
}

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

    facebook.authorizeCallback(requestCode, resultCode, data);
}

尝试了Manno23之前描述的方法,但是出现了以下错误:
06-30 19:27:04.338: ERROR/AndroidRuntime(349): Caused by: java.lang.NullPointerException 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at com.staffit.FacebookPage.getFriends(FacebookPage.java:67) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at com.staffit.FacebookPage.access$0(FacebookPage.java:55) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at com.staffit.FacebookPage$1.onComplete(FacebookPage.java:41) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at com.facebook.android.Facebook.authorizeCallback(Facebook.java:383) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at com.staffit.FacebookPage.onActivityResult(FacebookPage.java:93) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at android.app.Activity.dispatchActivityResult(Activity.java:3907) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): at android.app.ActivityThread.deliverResults(ActivityThread.java:2492) 06-30 19:27:04.338: ERROR/AndroidRuntime(349): ... 11 more
3个回答

4
这里的问题很多,但我认为你需要理解的第一件最重要的事情是,authorize调用是异步的。
这意味着onComplete()将在未来的某个时间被调用。由于它是异步的,您的Facebook请求会在代码中对onComplete()进行回调定义之后发生,但由于网络请求需要较长时间,因此这些调用会在Facebook登录的网络请求返回前完成,这意味着当您发出请求时没有授权令牌。
*我应该补充说明DialogListener是由Facebook编写的方便类,用于作为处理异步调用的回调方式。

1

以上两个答案都是正确的。你可以将负责请求的代码块放入一个单独的方法中,在onComplete()中调用该方法,即:

Facebook facebook = new Facebook("XXXXXasdasdajksdad");

TextView nText;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    nText = (TextView) this.findViewById(R.id.nameText);

    facebook.authorize(this, new String[] {"offline_access", "user_interests", "friends_interests"},

            new DialogListener() {
        public void onComplete(Bundle values) {
            getFriends();
            setContentView(R.layout.homepage);
        }

        public void onFacebookError(FacebookError error) {}

        public void onError(DialogError e) {}

        public void onCancel() {}
    });


}

private void getFriends(){

    JSONObject json_data = null;

    try
    {
        JSONObject response = Util.parseJson(facebook.request("me/friends")); // Get a friend information from facebook
        JSONArray jArray = response.getJSONArray("data");

        json_data = jArray.getJSONObject(0);
        String name = json_data.getString("name");
        Log.i("friend is", name);
        nText.setText(name);

    }
    catch (MalformedURLException e)
    {
        e.printStackTrace();
    }
    catch (JSONException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    catch (FacebookError e)
    {
        e.printStackTrace();
    }

}

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

    facebook.authorizeCallback(requestCode, resultCode, data);
}

你们太棒了,我现在正在尝试。 - user824015
刚刚尝试了一下,由于空指针异常而强制退出。 - user824015
检查logcat以找出是哪一行。使用调试器逐步执行代码,找出究竟出了什么问题。我有一种感觉,可能是你创建JSONArray的方式不对。尝试使用 'JSONArray jArray = new JSONArray(response.getString("data"));'。 - Jackson Walters
尝试过使用Jackson,它声称是setText行、public void getInfo()行、oncomplete行和新的对话框监听器行。 - user824015
解决了,实际上必须将TextView nText = (TextView) this.findViewById(R.id.nameText);放置在实际方法中,否则会出现各种问题(空指针异常)。 - user824015

0

只需在onComplete中调用facebook.request("me/friends"),然后让其余逻辑跟随。

这样,它只会在Facebook对象具有访问令牌时才调用,而不是在出现错误或类似情况时调用。 您可能希望使用DialogListener中的其他回调以获得更好的流程。 还要考虑在整个应用程序中维护该Facebook对象,如果您计划进行更多请求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接