I am trying to have my Android Application share a URI image to facebook. When using the picture parameter, it forces you to use a URL of a picture. Since I am trying to share from my phones gallery, I was wondering if there was a way to have a URI read like a URL, or any other way to do this. Any suggestions?
UPDATE: I have updated this by adding my code that I am attempting to use. I understand that I am not using the newly rolled out API of Facebook. I just want to be able to post a picture from my phone gallery to Facebook, and not a picture from URL. Thank you!
private String[] arrPath;
int id = viewIt.getId();
if(facebook.isSessionValid()) {
Bundle params = new Bundle();
params.putString("name", "AndroidApp");
params.putString("caption", "Application for Android");
params.putString("description", "This is a description");
params.putString("link", "http://www.google.com/");
params.putString("picture", "file://" + arrPath[id]);
facebook.dialog(AndroidClass.this, "feed", params, new DialogListener() {
#Override
public void onFacebookError(FacebookError e) {
// TODO Auto-generated method stub
}
#Override
public void onError(DialogError e) {
// TODO Auto-generated method stub
}
#Override
public void onComplete(Bundle values) {
// TODO Auto-generated method stub
}
#Override
public void onCancel() {
// TODO Auto-generated method stub
}
});
}else {
facebook.authorize(AndroidClass.this, new String[] {"email", "publish_stream"}, new DialogListener() {
#Override
public void onFacebookError(FacebookError e) {
// TODO Auto-generated method stub
Toast.makeText(AndroidClass.this, "fberror", Toast.LENGTH_SHORT).show();
}
#Override
public void onError(DialogError e) {
// TODO Auto-generated method stub
Toast.makeText(AndroidClass.this, "onError", Toast.LENGTH_SHORT).show();
}
#Override
public void onComplete(Bundle values) {
// TODO Auto-generated method stub
Editor editor = sp.edit();
editor.putString("access_token", facebook.getAccessToken());
editor.putLong("access_expires", facebook.getAccessExpires());
editor.commit();
}
#Override
public void onCancel() {
// TODO Auto-generated method stub
Toast.makeText(AndroidClass.this, "onCancel", Toast.LENGTH_SHORT).show();
}
});
}
}
});
You could open a stream to the image from the URI and post it that way using ContentResolver.
Session session = Session.getActiveSession();
Bitmap photo = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
Request request = Request.newUploadPhotoRequest(session, photo, new Request.Callback());
RequestAsyncTask task = new RequestAsyncTask(request);
task.execute();
Related
I have a LoginViaFacebook Acitivity and a login button for facebook Login.I use the following code to login to facebook
private String[] permissions = {"publish_stream",
"read_stream", "user_photos", "publish_checkins", "photo_upload",
"email", "user_birthday" };
if (access_token != null) {
Utility.fb.setAccessToken(access_token);
token = access_token;
Log.e("OnCretae Facebook Token------------", token);
}
if (expires != 0) {
Utility.fb.setAccessExpires(expires);
}
btn_login.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (CheckInternet.checkConn(LoginViaFacebook.this)) {
Utility.fb.authorize(LoginViaFacebook.this, permissions,
new DialogListener() {
#Override
public void onFacebookError(FacebookError e) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),
"onFacebookError",
Toast.LENGTH_LONG).show();
Log.e("Sajolllllllllllllllll", e + "");
}
#Override
public void onError(DialogError e) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),
"onError", Toast.LENGTH_LONG)
.show();
Log.e("Sajolllllllllllllllll", e + "");
}
#Override
public void onComplete(Bundle values) {
// TODO Auto-generated method stub
editor = sp.edit();
token = Utility.fb.getAccessToken();
Log.e("Token---------", token);
editor.putString("access_token",
Utility.fb.getAccessToken());
editor.putLong("access_expires",
Utility.fb.getAccessExpires());
editor.commit();
Toast.makeText(getApplicationContext(),
"Login Successful",
Toast.LENGTH_LONG).show();
mProgress = ProgressDialog.show(
LoginViaFacebook.this, "",
"Please Wait...", true);
Thread t = new Thread(retriveProfileData);
t.start();
}
#Override
public void onCancel() {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),
"onCancel", Toast.LENGTH_LONG)
.show();
}
});
}
}
});
I save the access token to login next time directly if user not logout
I have another activity namely Settings and have button Logout.I use following code to logout from facebook
lagoutLayout.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
final String[] items = new String[] { "Yes", "No" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
SettingsActivity.this,
android.R.layout.select_dialog_item, items);
AlertDialog.Builder builder = new AlertDialog.Builder(
SettingsActivity.this);
builder.setTitle("Select Option");
builder.setAdapter(adapter,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) { // pick
// from
// camera
if (item == 0) {
try {
editor.remove("FacebookId");
editor.remove("EmailId");
editor.commit();
Log.e("Pre----------------", sp1
.getString("access_token", "d"));
editor1.remove("access_token");
editor1.remove("access_expires");
editor1.commit();
Log.e("After----------------", sp1
.getString("access_token", "d"));
Log.e("DATATTAT--------",
sp.getString("FacebookId",
"saf")
+ " "
+ sp.getString(
"EmailId", "as"));
String r = Utility.fb
.logout(SettingsActivity.this);
Log.e("Res-----------", r);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else { // pick from file
dialog.dismiss();
}
}
});
dialog = builder.create();
dialog.show();
}
});
The response from Facebook Logout method show true in Log.
But when i again run application it will automatically login to facebook
I can'nt find out the problem.Please help me
I use this code and it worked fine
public void logout() {
if (!isConnected(activity)) {
Toast.makeText(activity, "Internet not connected", Toast.LENGTH_LONG).show();
return;
}
SessionEvents.onLogoutBegin();
AsyncFacebookRunner asyncRunner = new AsyncFacebookRunner(this.facebook);
asyncRunner.logout(this.context, new LogoutRequestListener());
}
And here is the listener
public class LogoutRequestListener extends BaseRequestListener {
public void onComplete(String response, final Object state) {
// callback should be run in the original thread,
// not the background thread
mHandler.post(new Runnable() {
public void run() {
SessionEvents.onLogoutFinish();
Intent intent= new Intent(activity,Login.class);
activity.startActivity(intent);
activity.finish();
}
});
}
}
For facebook sdk version 3 above
public void logoutFacebook() {
Session session = Session.getActiveSession();
if(session != null && session.isOpened()){
session.closeAndClearTokenInformation();
}
}
if you are extending and using facebook openSession when logging you must close it using closeSession and put it in your logout or you can simply put it onDestroy just like this
public void onDestroy() {
this.closeSession();
super.onDestroy();
}
Try this :
I hope this will be help to you...
if (mFacebook.isSessionValid()) {
try {
String str = mFacebook.logout(getApplicationContext());
SessionStore.clear(getApplicationContext());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
If you are viewing this answer from google suggestion and using facebook sdk v4 or above, just use this lines. It works perfectly.
if (AccessToken.getCurrentAccessToken() != null) {
LoginManager.getInstance().logOut();
}
I am new to facebook api and android.But somehow try to manage login to my facebook account and retrieve some information of my account i.e. id,first_name,last_name.The sdk(android) which is used on creating this application is sdk(android) level 8 but when i used sdk(android) level >8 application crash and error generate on logcat(networkonmainthreadException).I had done some search and found this is thread problem with sdk level and now i am going for Asynctask but got confused where to put the login code for facebook and what thing will return to mainactivity
My code for sdk level 8 is:-
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
loginnfetch=(Button) findViewById(R.id.button1);
loginnfetch.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
facebook=new Facebook(APP_ID);
restorecredential(facebook);
if(!facebook.isSessionValid())
{
loginandfetch();
}
else
{
fetch();
}
}
});
}
protected void fetch()
{
try {
JSONObject jobj=new JSONObject(facebook.request("me"));
int id=jobj.getInt("id");
String fname=jobj.getString("first_name");
String lname=jobj.getString("last_name");
//String emailid=jobj.getString("email");
Toast.makeText(getApplicationContext(), ".."+id+".."+fname+".."+lname, 0).show();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void loginandfetch()
{
facebook.authorize(this, PERMISSIONS, Facebook.FORCE_DIALOG_AUTH,new DialogListener() {
#Override
public void onFacebookError(FacebookError e)
{
Toast.makeText(getApplicationContext(), "ERROR WHILE LOGIN", 0).show();
}
#Override
public void onError(DialogError e) {
Toast.makeText(getApplicationContext(), "ERROR WHILE LOGIN", 0).show();
}
#Override
public void onComplete(Bundle values) {
saveCredentials(facebook);
fetch();
}
#Override
public void onCancel() {
Toast.makeText(getApplicationContext(), "ERROR WHILE LOGIN", 0).show();
}
});
}
protected boolean restorecredential(Facebook facebook2)
{
SharedPreferences sharedPreferences = getApplicationContext()
.getSharedPreferences(KEY, Context.MODE_PRIVATE);
facebook.setAccessToken(sharedPreferences.getString(TOKEN, null));
facebook.setAccessExpires(sharedPreferences.getLong(EXPIRES, 0));
return facebook.isSessionValid();
}
public boolean saveCredentials(Facebook facebook) {
Editor editor = getApplicationContext().getSharedPreferences(KEY,
Context.MODE_PRIVATE).edit();
editor.putString(TOKEN, facebook.getAccessToken());
editor.putLong(EXPIRES, facebook.getAccessExpires());
return editor.commit();
}
Please share some code if available or some link
thank you and sorry if something is not correct
From the ICS and above versions Android won't allowed any network operation in the UI thread.It should be done in separate thread so it won't hang the UI.Try your network communication code in the separate thread.
In your case,fetch facebook info using thread.
Try this ::
if(!facebook.isSessionValid())
{
new Thread(new Runnable() {
#Override
public void run() {
loginandfetch();
}
}).start();
}
else
{
new Thread(new Runnable() {
#Override
public void run() {
fetch();
}
}).start();
}
I have posted status on facebook like bellow. you can try something like this for your problem: (Facebook api 3.02b)
Request.Callback callback= new Request.Callback() {
public void onCompleted(Response response) {
FacebookRequestError error = response.getError();
if (error != null) {
Toast.makeText(context, "Failed to Post", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context, "Successfully Posted", Toast.LENGTH_LONG).show();
}
}
};
Request request = new Request(session, victimId+"/feed", bundle,
HttpMethod.POST, callback);
RequestAsyncTask task = new RequestAsyncTask(request);
task.execute();
Its strange that I am using right code to make dialog with predefined content. But it isn't working :( guide me if I am wrong, thanks
Code:
Bundle params = new Bundle();
params.putString("message", "Predef Message");
Facebook facebook = new Facebook("APP_ID");
facebook.dialog(this, "feed", params, new DialogListener(){
#Override
public void onComplete(Bundle values) {
// TODO Auto-generated method stub
}
#Override
public void onFacebookError(FacebookError e) {
// TODO Auto-generated method stub
}
#Override
public void onError(DialogError e) {
// TODO Auto-generated method stub
}
#Override
public void onCancel() {
return;
}});
I found that we can't predefined a message for posting on wall, check this https://developers.facebook.com/docs/reference/androidsdk/dialog/ it requires user interaction
Message for Post on wall, Share a link or any else require user interaction. So a workaround is share a link and add description to it :)
Try this it is work for me
public void postfb() {
Log.i("PostFB", "POST FB ENTERED..!!");
Facebook facebook;
// facebook = new Facebook(InfrqncyApplication.APP_ID);
facebook = new Facebook(APP_ID);
// replace APP_API_ID with your own
facebook.authorize(getActivity(), new String[] { "publish_stream",
"offline_access" }, null);
Bundle params = new Bundle();
params.putString("link", imagePostPath);
params.putString("name", etxtTitle.getText().toString().trim());
// params.putString("caption","Via Sharesi.es");
params.putString("description", etxtDescription.getText().toString());
params.putString("picture", imagePostPath);
facebook.dialog(getActivity(), "stream.publish", params,
new DialogListener() {
#Override
public void onComplete(Bundle values) {
final String postId = values.getString("post_id");
if (postId != null) {
Toast.makeText(getActivity(),
"Posted sucessfully !", Toast.LENGTH_SHORT)
.show();
AddPost();
} else {
Log.d("FB Sample App", "Canceled by User");
}
}
#Override
public void onFacebookError(FacebookError error) {
AddPost();
Log.e("fb", "fb error" + error);
}
#Override
public void onError(DialogError e) {
AddPost();
Log.e("fb", "fb dialog error" + e.getLocalizedMessage());
}
#Override
public void onCancel() {
AddPost();
}
});
}
I have followed facebooks tutorial and setup the sso key and have integrated the sdk into my code. After logging into facebook , the facebook.authorize it brings me to a new screen which just says "loading" and sits there.
It can works on emulator but not on my desire HD,
I've tried add ",Facebook.FORCE_DIALOG_AUTH" , it doesn't work for me.
Image is just has a message says "loading..."
thanks a lot!
Facebook facebook = new Facebook("MyAppID");
String id,name;
TextView t1;
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
t1 = (TextView) findViewById(R.id.id);
}
facebook.authorize(this,new String[] {"user_about_me"},new DialogListener() {
#Override
public void onComplete(Bundle values) {
GET();
}
#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);
facebook.authorizeCallback(requestCode, resultCode, data);
}
public void GET(){
try {
JSONObject json1 = new JSONObject(facebook.request("me"));
if(json1 != null)
{
for(int i=0;i<json1.length();i++)
{
id = json1.getString("id");
name = json1.getString("name");
}
}
t1.setText(id + "," + name);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
You have written this line ...
Facebook facebook = new Facebook("appid");
The string should not be "appid" but a real app id from facebook.
Login to your account and get a facebook Id from here ...
developers.facebook.com/apps/?action=create
How to send an invitation to facebook friends through my App on Android..
Here is how you can do it:
public void inviteFriends(Activity activity, ArrayList<FriendInfo> friendsIds){
// Safe programming
if(friendsIds == null || friendsIds.size() == 0)
return;
Bundle parameters = new Bundle();
// Get the friend ids
String friendsIdsInFormat = "";
for(int i=0; i<friendsIds.size()-1; i++){
friendsIdsInFormat = friendsIdsInFormat + friendsIds.get(i) + ", ";
}
friendsIdsInFormat = friendsIdsInFormat + friendsIds.get(friendsIds.size()-1).getId();
parameters.putString("to", friendsIdsInFormat);
parameters.putString( "message", "Use my app!");
// Show dialog for invitation
mFacebook.dialog(activity, "apprequests", parameters, new Facebook.DialogListener() {
#Override
public void onComplete(Bundle values) {
// TODO Auto-generated method stub
}
#Override
public void onFacebookError(FacebookError e) {
// TODO Auto-generated method stub
}
#Override
public void onError(DialogError e) {
// TODO Auto-generated method stub
}
#Override
public void onCancel() {
// TODO Auto-generated method stub
}
});
}
Facebook dialog reference