我是Android编码的新手,我正在尝试访问Facebook新闻提要并在listview中显示。我在一个活动中使用 facebook 按钮小部件对用户进行身份验证,并将会话传递给下一个活动。会话正确通过,但是当我尝试获取新闻提要请求的响应并存储在 GraphObject 中时,它返回 null。
这是我尝试过的:
new Request(
userSession,
"/me/home",
null,
HttpMethod.GET,
new Request.Callback() {
public void onCompleted(Response response) {
try
{
GraphObject newsFeed = response.getGraphObject();
JSONObject jsonObj=newsFeed.getInnerJSONObject();
JSONArray jsonArr = jsonObj.getJSONArray("data");
for(int i=0;i<jsonArr.length();i++)
{
JSONObject jsonObj1=jsonArr.getJSONObject(i);
strings.add(jsonObj1.getString("id"));
}
} catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
).executeAsync();
}
调试时,图形对象返回 null。我是安卓开发的新手,一直在尝试阅读文档。任何更好地理解这一点的链接将不胜感激。提前谢谢。
确保:
1. 您已使用 OpenSSL 正确生成应用标识,并在应用程序清单中声明了该应用标识。
2. 应用程序包名称和应用程序 ID 已正确输入到您的 Facebook 应用程序详细信息页面上。
3. 您已申请相关权限并从FB获得。
4. 访问令牌有效(即非空)。
5. 访问令牌的会话状态为"已打开"。
用参数传递给 GraphRequest 的问题,所以要找到它,请将 facebook 错误检查代码写入 GraphRequest 这里我编写了名为 makeMeRequest(Accesstoken accesstoke)的完整方法,这里访问令牌由 facebook 提供,因此您必须在调用此方法时传递给它。这是此方法的代码
private void makeMeRequest(AccessToken accesstoken) {
GraphRequest request = GraphRequest.newMeRequest(accesstoken, new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
FacebookRequestError facebookRequestError = response.getError();
if (facebookRequestError != null) {
Log.e("Error", facebookRequestError + "");
}
try {
System.out.println("GraphRequest response----" + object);
System.out.println("GraphRequest response----" + object.getString("name"));
System.out.println("GraphRequest response----" + object.getString("email"));
} catch (Exception e) {
e.printStackTrace();
}
HashMap<String, String> fb_data = new HashMap<String, String>();
try {
fb_data.put("name", object.getString("name"));
} catch (Exception e) {
fb_data.put("name", "");
}
try {
fb_data.put("id", object.getString("id"));
} catch (Exception e) {
fb_data.put("id", "");
}
try {
fb_data.put("email", object.getString("email"));
} catch (Exception e) {
fb_data.put("email", "");
}
try {
fb_data.put("dob", object.getString("dob"));
} catch (Exception e) {
fb_data.put("dob", "");
}
pdialog.show();
if (fb_data.get("email").equalsIgnoreCase("") || fb_data.get("email") == null) {
checkSocialMedia("facebook", fb_data);
} else {
LoginProcess(fb_data, "facebook");
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "picture,id,name,link,email,gender,birthday,location,first_name,last_name");
request.setParameters(parameters);
request.executeAsync();
}
在此方法中,您可以看到此代码将返回错误的代码,您将了解错误消息并可以对其进行管理
FacebookRequestError facebookRequestError = response.getError();
if (facebookRequestError != null) {
Log.e("Error", facebookRequestError + "");
}
但是,如果错误是关于已弃用的参数传递到图形请求对象中,则在它已弃用时对其进行检查,如果已弃用,它将打印到 facebook 错误消息中,您必须将其从参数中删除...这是来自方法makeMeRequest()的图形请求对象的代码
Bundle parameters = new Bundle();
parameters.putString("fields", "picture,id,name,link,email,gender,birthday,location,first_name,last_name");
request.setParameters(parameters);
request.executeAsync();
您只需要从中删除该参数
parameters.putString("fields", "picture,id,name,link,email,gender,birthday,location,first_name,last_name");
并且您的fb登录集成工作正常