当 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 API 获取数据

Facebook通过应用程序登录VS通过Android应用程序中的设备浏览器登录

Facebook通过应用程序登录VS通过Android应用程序中的设备浏览器登录

Facebook警告输入凭据未在真实设备IOS6上出现