Like an object from anbdroid app does not appear on facebook - android

I have facebook object id = 235563339900978
(you can check it here - http://graph.facebook.com/235563339900978)
i have such code
Bundle params = new Bundle();
params.putString("object", "http://samples.ogp.me/235563339900978");
// DO PUBLISH
Request request = new Request(
Session.getActiveSession(),
"me/og.likes",
params,
HttpMethod.POST
);
return request.executeAndWait();
I run this code and get positive answer from facebook
response with code 200.
Also if I then again run that code i get such answer
errorMessage: (#3501) User is already associated to the object type, website, on a unique action type Like. Original Action ID: 1400818803525892}
so I suppose like was succesfull.
But i can not see it on timeline at all.
I did like, but it was not appear on timeline,
despite the fact I saw positive response
with code 200.
Why?

Related

Getting incorrect facebook friend id

I am getting a wrong Facebook Friend Id: I am getting some long alphanumeric value in id which, among the other things, is also not unique (e.g. it changes on each call).
Actually I want to use this id as a unique identifier to login, but since it changes every time is not so helpful.
So what's wrong here? What else can I do for unique identification? Any suggestion will be appreciated.
I am using this code to get friend list:
Bundle required = new Bundle();
required.putString("fields", "uid, name, picture.type(square), gender, email");
//Request for friendlist from facebook
Request req = new Request(session, "me/taggable_friends", required, HttpMethod.GET,
new Callback() {
#Override
public void onCompleted(Response response)
{
is2=response.getGraphObject();
JSONObject json = is2.getInnerJSONObject();
readResponse(json);
String str = json.toString();
saveFileOnSD("data", str);
// generateNoteOnSD("frinedresponse", str);
Log.v(TAG, str);
}
});
Request.executeBatchAsync(req);
The problem is that you are using taggable_friends. Taggable_friends are for if you want to tag friends. It is by design that the id changes every single time you call it.
If you want friends you should use /me/friends but it will only return friends that are already using the app.
Depending on what you need all friends for some solutions can be found here: https://developers.facebook.com/docs/apps/faq
On 30th April 2014 facebook make so many changes, so if you create you facebook APP ID after this date you can't get facebook id of your friend with taggable_friend, so for getting facebook id of your friend you need to use "me/friends instead of me/taggable_friend", but you get only those friend list who are using your app.

facebook realtime updates from android

How do I get facebook realtime updates with android .Basically everytime the user's friendlist changes I need to update the count.I used the code below but I get error msg :
{This method must be called with an app access_token.}, isFromCache:false}
I really appreciate any help.Thanks in Advance.
code:
Bundle params = new Bundle();
params.putString("object", "user");
params.putString("callback_url", "http://example.com/callback/update.php");
params.putString("fields", "friends");
params.putString("verify_token", "1234");
/* make the API call */
new Request(
session,
"/12345/subscriptions",
params,
HttpMethod.POST,
new Request.Callback() {
public void onCompleted(Response response) {
/* handle the result */
}
}
).executeAsync();
Note: session =fb.getsession();
This error:
"This method must be called with an app access_token."
is quite straight-forward. You just need to make this API call with an App access token, instead of a normal access token (user token). To use it with your call simply add another parameter: access_token and make the call.
The App Access token is nothing but, APP_ID|APP_SECRET, or you can make the call (ref.)-
GET /oauth/access_token?
client_id={app-id}
&client_secret={app-secret}
&grant_type=client_credentials
But beware, its not recommended to expose app access token on the client side, since its like a password of your app.

Facebook Graph API unlike a liked post

I have a method in my app that allows the user to "like" a post in his/her news feed. It's done with a simple graph request using HttpMethod.POST. But when I try to do an "unlike" action using HttpMethod.DELETE, I get an error callback:
02-08 00:35:57.298: I/Detail(2628): {Response: responseCode: 403, graphObject: null, error:
{HttpStatus: 403, errorCode: 200, errorType: OAuthException, errorMessage: (#200)
Feed story publishing to other users is disabled for this application}, isFromCache:false}
Now I assume this has something to do with the latest attempt to make all apps that integrate with Facebook use all Facebook looking dialogs and styles, but I could be wrong. Here's the roadmap post that has me suspicious:
Removing ability to post to friends walls via Graph API We will
remove the ability to post to a user's friends' walls via the Graph
API. Specifically, posts against [user_id]/feed where [user_id] is
different from the session user, or stream.publish calls where the
target_id user is different from the session user, will fail. If you
want to allow people to post to their friends' timelines, invoke the
feed dialog. Stories that include friends via user mentions tagging or
action tagging will show up on the friend’s timeline (assuming the
friend approves the tag). For more info, see this blog post.
Any ideas on what I could be doing wrong, or is Facebook just ruining me? Thanks!
EDIT: Here's the code I'm using to run the request.
Request likeRequest = new Request(Utility.fbSession, null, null, null, new Request.Callback() {
#Override
public void onCompleted(Response response) {
String responseString = response.toString();
Log.i("Detail", responseString);
updateDetail();
}
});
HttpMethod nextLikeCall = HttpMethod.DELETE;
likeRequest.setHttpMethod(nextLikeCall);
likeRequest.setGraphPath(itemId+"/likes");
likeRequest.executeAsync();
When you grab the post id from the graph data, it should be in a format like: XXXXX_YYYYY. The XXXXX is simply the users id and YYYYY is the actual post id. What you need to do is extract and use just the YYYYY portion of the post id that graph gives you. so instead of graph.facebook.com/XXXXX_YYYYY/likes.... you want to send graph.facebook.com/YYYYY/likes. This will work with both liking and unliking, you can test in graph explorer first before hacking together a substring extraction method.
Not sure how to extract a section of a string on Android, but I know in Objective-C/iOS, it can be done like this (code not tested, for reference/idea) :
SString *actualPostIdStr; //The String we will put the actual postId in
NSString *oldIdStr = //<the string in format XXXXX_YYYYY>
NSInteger charCount = [oldIdStr length]; //get the length of the original XXXXX_YYYYY string
NSRange fRangeCount = [oldIdStr rangeOfString:#"_"]; //get count of characters to remove (XXXXXX)
if (fRangeCount.location != NSNotFound){
NSInteger startingPos = fRangeCount.location + 1; //get the starting character position of the actual postId
actualPostIdStr = [[oldIdStr substringWithRange:NSMakeRange(startingPos, charCount - startingPos)] copy];
}
Hope this helps.
EDIT:
Ok, so I have been playing around with likes all day... It seems that this method sometimes doesn't work, but it all depends on the type of graph object which you are attempting to like/unlike. For example... plain status posts, this method works perfectly. However, I ran into a problem when trying to like a photo with a message/story post object. It turns out, in the graph data for this type of post object with photo, there is an additional paramter called "object_id", in addition to the plain "id" that is in status post graph data. in this case, with the photo and story post, you need to pass the "object_id", unaltered for successful unliking.
This mess seems like either a bug on FB's end, or they are making changes and disallowing likes/unlikes from graph api & just forgot/haven't to told us yet :) hopefully the former. In the mean time, you're just going to have to use my above answer, but just make sure you test with as many different types of post objects you can find, and use if conditions when a different id (portion of "id"... "object_id"... etc) is required.
Sometimes Daniel McCarthy's method don't work. In this case we need get Graph API request XXX_YYYY, find field object_id and unlike this object_id fid.

Facebook android API function executeGraphPathRequestAsync not giving expected results

I'm trying to discover if a user likes a specific facebook page by using Graph API inside an android application using the FB SDK v3.
The following call works and reports all of the likes of the user along with every other detail to do with each resulting item.
Request.executeGraphPathRequestAsync(session, "me/likes", new Request.Callback()
Since I'm not interested in any peripheral data, I just want to get the id back so I can lookup the page I'm interested in, but when I add the parameters as follows...
Request.executeGraphPathRequestAsync(session, "me/likes?fields=id", new Request.Callback()
... no object is returned from the call. If I post the same queries in the Graph API explorer they give back the expected results.
In addition to this question, is it at all possible to limit the result of the query to just the page ID to begin with, since I already know that piece of information? I have no use for the rest of the data being returned and would prefer not to chew up user bandwidth unnecessarily. I've searched high and low and it doesn't seem possible. Even the FQL explorer doesn't work when trying to limit by both user and page iD as the example suggests. I get an empty result set when adding 'AND page_id=xxx' to the query.
As far as i know, you cant run queries with field in 'executeGraphPathRequestAsync'.
instead use 'Request' and run in with 'RequestAsyncTask'.
Short example:
String grapPath = "me/home";
Bundle params = new Bundle();
params.putString("fields", "type,id,object_id,created_time,from,picture,likes");
params.putString("limit", "500");
Request request = new Request(session, grapPath, params, HttpMethod.GET, new Callback()
{
#Override
public void onCompleted(Response response)
{
if (response != null)
{
Log.d(TAG_NAME, "response: " + response.toString());
}
}
});
RequestAsyncTask task = new RequestAsyncTask(request);
task.execute();
Hope i managed to help you :)
The Facebook SDK will add the "?access_token" to the end of the graph path string. So the graph command ends up looking like:
me/likes?fields=id?access_token
Break out the fields into a params Bundle.
Found this issue resolved in a Facebook bug post:
http://developers.facebook.com/bugs/314504765319932?browse=search_5116b87d245900257505334

Facebook Android Checkins

Ok so I have been researching the facebook api and Noticed that they released a new SDK. I have been trying to implement a checkin to a known place id.
I have seen posts that use the facebook.request("me/checkins", params, "POST"); to checkin using the facebook instance.
I realize that checkins are depreciated and that i should be posting with a location/place id instead. The problem comes when i want to search for all of my friends that have been to that location within that past 24 hours. I do not want to filter through all of my friends posts to retrieve the ones with my known locations.
With checkins i simply made a call to the placeid/checkins and filtered out all checkins that were too old to matter.
Has anyone gotten checkins to work using Request?
Is there a graphpath that will allow me to post a checkin to a place? me/checkins perhaps?
I am trying to use something like Request(session, "me/checkins", parameters, POST) But i have been unsuccessful so far.
If there is not a way to do this with Session and Request then do Facebook and asyncFacebook runners work well with SSO?Can they be mixed?
This is my code to post a checkin.
params.putString("place", "166793820034304");
params.putString("message", "checking in "
params.putString("coordinates", "{\"longitude\":-122.1477782,\"latitude\":37.48566}");
Request.Callback callback6 = new Request.Callback() {
public void onCompleted(Response response) {
// response here
}
};
Request request6 = new Request(session, "me/checkins", params, HttpMethod.POST, callback6);
RequestAsyncTask task6 = new RequestAsyncTask(request6);
task6.execute();

Categories

Resources