我正在尝试使用最新的Facebook SDK访问我朋友的生日。由于最新的更新,我被迫多次调用 api 来完成此操作。一次是我的朋友,然后用他们的user-id
查询他们的生日。
获取生日的内部查询,将被完全跳过。
我不确定我是否做得对。
这是我的背景AsyncTask
类,其中包含调用:
/**
* Background Async Task to Load all friends by making calls the Graph API
* */
class LoadAllFriends extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
...
}
/**
* getting All friends and birthdays from api
* */
protected String doInBackground(String... args) {
try
{
final AccessToken accessToken = AccessToken.getCurrentAccessToken();
GraphRequestAsyncTask graphRequestAsyncTask = new GraphRequest(
accessToken,
"/me/friends",
null,
HttpMethod.GET,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
try
{
friends = response.getJSONObject().getJSONArray("data");
Log.d("Friends length",String.valueOf(friends.length()));
for (int l=0; l < friends.length(); l++)
{
final HashMap hm = new HashMap<String, Date>();
hm.put("uid", friends.getJSONObject(l).getString("id"));
hm.put("name",friends.getJSONObject(l).getString("name"));
GraphRequestAsyncTask graphRequestAsyncTask = new GraphRequest(
accessToken,
"/"+hm.get("uid"),
null,
HttpMethod.GET,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
try
{
JSONArray birthday = response.getJSONObject().getJSONArray("data");
Log.d("birthday",(String) birthday.getJSONObject(0).get("birthday"));
hm.put("date", (Date) birthday.getJSONObject(0).get("birthday"));
} catch (Exception e) {
e.printStackTrace();
}
}}).executeAsync();
friendsList.add(hm);
}
DateFormat dateFormat = new SimpleDateFormat("MM/dd/yy");
Calendar cal = Calendar.getInstance();
Date date1 = dateFormat.parse(dateFormat.format(cal.getTime()));
cal.add(Calendar.DATE, 30);
Date date2 = dateFormat.parse(dateFormat.format(cal.getTime()));
Iterator<HashMap<String, Object>> iter = friendsList.iterator();
while (iter.hasNext())
{
HashMap<String, Object> map = iter.next();
Log.d("uid", (String) map.get("uid"));
Log.d("name", (String) map.get("name"));
Log.d("date", (String) map.get("date"));
/*if (date1.compareTo((Date) map.get("date")) < 0 ||
date2.compareTo((Date) map.get("date")) > 0)
{
friendsList.remove(map);
}*/
}
}
catch (JSONException e)
{
e.printStackTrace();
}
catch (ParseException e)
{
e.printStackTrace();
}
}
}
).executeAsync();
if (friendsList.size() > 0)
{
friendsFound = true;
}
else
{
friendsFound = false;
}
}
catch(NullPointerException e){
e.printStackTrace();
}
catch(RuntimeException e){
e.printStackTrace();
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url)
{
// dismiss the dialog after getting all events
pDialog.dismiss();
// updating UI from Background Thread
runOnUiThread(new Runnable()
{
public void run()
{
...
}
});
}
}
这里:
Log.d("birthday",(String) birthday.getJSONObject(0).get("birthday"));
在内部 API 中,调用不会显示在终端中。正在为迭代器显示friends.length()
和来自迭代器的日志输出,并且仅显示uid
和name
。日志 date
抛出以下错误:
AndroidRuntime: FATAL EXCEPTION: main
Process: com.supre.www.surprise, PID: 18142
java.lang.NullPointerException: println needs a message
at android.util.Log.println_native_inner(Native Method)
at android.util.Log.println_native(Log.java:290)
at android.util.Log.d(Log.java:323)
at com.supre.www.surprise.HomeActivity$LoadAllFriends$1.onCompleted(HomeActivity.java:237)
at com.facebook.GraphRequest$5.run(GraphRequest.java:1368)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5312)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
请帮忙!
出于隐私原因,您无法获取未授权您的应用的朋友的生日。图形 API 的 v2.0 删除了所有好友权限:https://developers.facebook.com/docs/apps/changelog#v2_0
您只能通过以下 API 调用获得通过 user_friends
和 user_birthday
授权您的应用程序的朋友的生日:me/friends?fields=name,birthday
您无法访问好友的详细信息,除非他们安装了您的应用程序并使用 Facebook 在您的应用程序中登录/注册。只
"summary": {
"total_count": 2
}
只有安装此应用程序的朋友才会在 API v2.0 和高等。total_count汇总代表朋友总数,包括那些尚未安装该应用程序的人。
如果有任何朋友安装了您的应用程序,以下是可以访问其数据的代码:
GraphRequest request = GraphRequest.newMeRequest(
accessToken,
new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
// Insert your code here
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "email,birthday,friends{birthday}");
request.setParameters(parameters);
request.executeAsync();
如果有人有问题,请告诉我!