在设备/模拟器上安装Facebook应用程序时,发布到用户的Facebook墙壁不起作用 [英] Post to user facebook wall not working when Facebook app is installed on device/emulator

查看:133
本文介绍了在设备/模拟器上安装Facebook应用程序时,发布到用户的Facebook墙壁不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经构建了一个使用的活动实施(请参阅接受的答案)在用户的Facebook墙上发布状态更新。

I've built an activity that uses this implementation (see the accepted answer) to post a status update on a user's facebook wall.

如果模拟器/手机没有安装Facebook应用

It works with no problem if the emulator/phone does not have the facebook app installed.

如果模拟器/手机安装了Facebook应用程序,则Facebook应用程序加载登录屏幕,但尝试登录后,Facebook应用程序将消失,使我回到我的应用程序

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.

有没有人在安装了Facebook应用程序时有这样的经历?

Has anyone had this experience when the facebook app is installed?

我的代码: p>

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告诉我: / p>

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

编辑
:在过去一年里,在多台机器上安装android开发平台后,总是在创建新的开发环境后遇到问题,我发现这个简单答案可能是在一个设备上执行Facebook实现的原因,而不是另一个设备。

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....

秘密Facebook API密钥(您在developer.facebook.com上列出的密钥)对于您使用不同证书打包的每个应用程序版本将不同。例如,说你有两台开发机器。由于这两台机器都将使用不同的证书构建您的应用程序,因此您必须确保为每台计算机生成一个Facebook API密钥,并将其列在developer.facebook.com。

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.

推荐答案

这是因为当您登录Facebook帐户时,您的登录会话将在设备中创建。在完成任务后,您必须从Facebook注销。

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.

这篇关于在设备/模拟器上安装Facebook应用程序时,发布到用户的Facebook墙壁不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆