Reputation: 5925
I've built an activity that uses this implementation (see the accepted answer) to post a status update on a user's facebook wall.
It works with no problem if the emulator/phone does not have the facebook app installed.
If the emulator/phone has the facebook app installed, the facebook app loads the login screen, but after trying to login, the facebook app just disappears bringing me back to my app.
Has anyone had this experience when the facebook app is installed?
My code:
public class AchievementActivity extends Activity implements DialogListener, OnClickListener{
private Facebook facebook;
Button facebookPostButton;
String defaultFacebookPost;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.achievements);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_layout);
View achievementDivider = (View)findViewById(R.id.achievementDivider);
int[] colors = {0, 0xff00ffff, 0};
achievementDivider.setBackgroundDrawable(new GradientDrawable(Orientation.RIGHT_LEFT, colors));
//get the title of the achievement from the intent that started this activity from the activity StatisticsActivity
String achievementTitleString = getIntent().getStringExtra("title");
String achievementTextToDisplay = getAchievementTextToDisplay(achievementTitleString);
defaultFacebookPost = getDefaultPost(achievementTitleString);
//ImageView achievementActivityAchievementBadgeImageView = (ImageView)findViewById(R.id.achievementActivityAchievementBadgeImageView);
TextView achievementActivityBadgeTitleTextView = (TextView)findViewById(R.id.achievementActivityBadgeTitleTextView);
achievementActivityBadgeTitleTextView.setText(achievementTitleString);
TextView achievementActivityAchievementText = (TextView)findViewById(R.id.achievementActivityAchievementText);
achievementActivityAchievementText.setText(achievementTextToDisplay);
facebookPostButton = (Button)findViewById(R.id.facebookPostButton);
facebookPostButton.setOnClickListener(this);
}
@Override
public void onComplete(Bundle values) {
if (values.isEmpty())
{
Toast.makeText(getApplicationContext(), "Empty", Toast.LENGTH_SHORT);
return;
}
if (!values.containsKey("post_id"))
{
try
{
Bundle parameters = new Bundle();
parameters.putString("message", defaultFacebookPost);// the message to post to the wall
facebook.dialog(AchievementActivity.this, "stream.publish", parameters, this);// "stream.publish" is an API call
}
catch (Exception e)
{
// TODO: handle exception
System.out.println(e.getMessage());
}
}
try
{
facebook.logout(getApplicationContext());
}
catch (MalformedURLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onFacebookError(FacebookError error)
{
Toast.makeText(AchievementActivity.this, "onFacebookError", Toast.LENGTH_LONG);
}
@Override
public void onError(DialogError e)
{
Toast.makeText(AchievementActivity.this, "onError", Toast.LENGTH_LONG);
}
@Override
public void onCancel()
{
Toast.makeText(AchievementActivity.this, "onCancel", Toast.LENGTH_LONG);
}
@Override
public void onClick(View v)
{
if (v == facebookPostButton)
{
facebook = new Facebook("my_facebook_api");
// replace APP_API_ID with your own
facebook.authorize(this, new String[] {"publish_stream", "read_stream", "offline_access"}, this);
}
}
private String getDefaultPost(String defaultTitleString)
{
//do some stuff here to get a string to post to wall
return defaultPost;
}
private String getAchievementTextToDisplay(String achievementTitleString) {
String achievementTextToDisplay = "DEFAULT";
//do some stuff here to get text to display in the activity
//this has nothing to do with the facebook post...
return achievementTextToDisplay;
}
}
Logcat is telling me this:
05-11 13:03:34.076: INFO/ActivityManager(98): Starting activity: Intent { cmp=com.facebook.katana/.ProxyAuth (has extras) }
05-11 13:03:34.246: INFO/ActivityManager(98): Displayed activity com.facebook.katana/.ProxyAuth: 158 ms (total 158 ms)
05-11 13:03:35.166: DEBUG/dalvikvm(12390): GC_FOR_MALLOC freed 6729 objects / 418424 bytes in 44ms
05-11 13:03:35.166: DEBUG/webviewglue(12390): nativeDestroy view: 0x527e20
05-11 13:03:35.166: DEBUG/NativeCrypto(12390): Freeing OpenSSL session
EDIT : After having to install the android development platform on multiple machines over the past year and ALWAYS having an issue with Facebook after creating the new development environments, I have found that this simple answer can be the cause for a Facebook implementation working on one device and not another....
The secret Facebook API key (the one you list on developer.facebook.com) will be different for each version of your app that you package with a different certificate. For example, say you have two development machines. Since both of these machines will build your applications with a different certificates, you must ensure that you generate a Facebook API secret key for each machine and list them at developer.facebook.com.
Upvotes: 4
Views: 4998
Reputation: 2362
I have found a workaround but it is not the best so far.
facebook.authorize(activity, PERMISSIONS, Facebook.FORCE_DIALOG_AUTH,
new LoginDialogListener());
This will force that your app does not use the SSO if official facebook app is installed on the device. But there must be a better solution because there are apps out there which use sso with the official facebook app.
Upvotes: 3
Reputation: 2137
private static final String[] PERMISSIONS =
new String[] {"publish_stream", "read_stream", "offline_access"};
@Override
public void onClick(View v)
{
if (v == facebookPostButton)
{
mAsyncRunner = new AsyncFacebookRunner(mFacebook);
mAsyncRunner.request(mFacebook.logout(getApplicationContext()), new LogoutListener());
mFacebook.authorize(FacebookImplement.this, PERMISSIONS, new AuthorizeListener());
}
}
public class AuthorizeListener extends BaseDialogListener {
public void onComplete(Bundle values) {
Bundle params = new Bundle();
params.putString("message"," Message");
params.putString("description", "Wall Posting Description");
mAsyncRunner.request("me/feed", params, "POST",
new UploadListener());
}
}
public class UploadListener extends BaseRequestListener {
public void onComplete(final String response) {
mAsyncRunner.request(mFacebook.logout(getApplicationContext()), new LogoutListener());
}
}
public class LogoutListener extends BaseRequestListener {
public void onComplete(final String response) {
}
}
May be this code helps you. If there is any problem then ask without any issue.
Upvotes: 0
Reputation: 2137
It is because when you logged in the facebook account then your login session is created in the device. You have to logout from the facebook after doing your task.
Upvotes: 1