当 Facebook 应用程序安装在设备/模拟器上时,发布到用户 facebook 墙不起作用
Posted
技术标签:
【中文标题】当 Facebook 应用程序安装在设备/模拟器上时,发布到用户 facebook 墙不起作用【英文标题】:Post to user facebook wall not working when Facebook app is installed on device/emulator 【发布时间】:2011-05-11 06:39:10 【问题描述】:我已经建立了一个活动,它使用this 实现(请参阅接受的答案)在用户的 Facebook 墙上发布状态更新。
如果模拟器/手机没有安装 facebook 应用程序,它可以正常工作。
如果模拟器/手机安装了 facebook 应用程序,则 facebook 应用程序会加载登录屏幕,但在尝试登录后,facebook 应用程序就会消失,让我回到我的应用程序。
有没有人在安装 facebook 应用时有过这样的经历?
我的代码:
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 告诉我这个:
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
编辑 :在过去一年不得不在多台机器上安装 android 开发平台并且在创建新的开发环境后总是遇到 Facebook 问题之后,我发现这个简单的答案可能是 Facebook 实现在一台设备上工作的原因,并且不是另一个……
Facebook API 密钥(您在 developer.facebook.com 上列出的那个)对于您使用不同证书打包的每个版本的应用程序都会有所不同。例如,假设您有两台开发机器。由于这两台机器都将使用不同的证书构建您的应用程序,因此您必须确保为每台机器生成 Facebook API 密钥并在 developer.facebook.com 上列出它们。
【问题讨论】:
您是否安装了最新的 FB 应用更新?当我过去使用 FB SDK 时,我遇到了一些麻烦,因为 FB 应用程序没有更新到最新版本(检查市场应用程序,我的应用程序,确保 FB 应用程序没有待处理的更新)。 @Mathias Lin - 我使用的 Facebook 版本与 Facebook SKD 附带的版本相同。当您从 gitHub 获取应用程序时,它们会为您提供该应用程序的编译副本。 【参考方案1】:我找到了解决方法,但目前还不是最好的。
facebook.authorize(activity, PERMISSIONS, Facebook.FORCE_DIALOG_AUTH,
new LoginDialogListener());
如果设备上安装了官方 facebook 应用程序,这将强制您的应用程序不使用 SSO。但必须有更好的解决方案,因为有一些应用程序使用 sso 和官方 facebook 应用程序。
【讨论】:
【参考方案2】:这是因为当您登录 facebook 帐户时,您的登录会话会在设备中创建。完成任务后,您必须退出 Facebook。
【讨论】:
感谢您的回复,但我似乎仍然无法让 facebook 应用程序保持活力。它只是消失了。我已经编辑了我的问题以包含我的活动的代码。 请提供更详细的答案!【参考方案3】: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)
也许这段代码对你有帮助。如果有任何问题,然后问没有任何问题。
【讨论】:
非常感谢您向我提供您的代码,但我仍然得到相同的结果。 facebook 应用程序打开,但立即关闭,让我立即回到应用程序的主要活动。此外,我建立了一个新项目并在我的新项目中使用了来自 www.facebook/developers 的 facebook 代码,facebook 应用程序再次打开,然后立即关闭。这仅在设备安装了 facebook 时发生,使用 webview 时一切正常。我在这里完全不知所措。 您让我走上了正确的轨道,您未正确登录和退出会话的原始答案是正确的。在看到上面的代码并查看 github 上的示例后,我终于能够让它工作了。 我也遇到了类似的问题。关于正确登录和退出会话,我不太了解您的 cmets...您能详细说明一下吗? 当您登录 facebook 帐户时,您的设备会为该用户 ID 创建会话。当用户再次出现时,该用户 ID 将用作登录,直到您注销 Facebook 帐户。 我不关注这个。 Facebook API 的单点登录功能的重点在于,应用用户不必在每次使用应用时都看到长屏幕。也就是说,我发现他们的 Android API 非常脆弱。以上是关于当 Facebook 应用程序安装在设备/模拟器上时,发布到用户 facebook 墙不起作用的主要内容,如果未能解决你的问题,请参考以下文章
IOS中的Facebook登录适用于模拟器,但不适用于安装了本机应用程序的设备
如何在 IOS5 模拟器上获取 Facebook 应用程序?
Facebook通过应用程序登录VS通过Android应用程序中的设备浏览器登录