在设备/模拟器上安装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.