我已经构建了一个使用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上。
答案 0 :(得分:3)
我找到了一种解决方法,但到目前为止并不是最好的。
facebook.authorize(activity, PERMISSIONS, Facebook.FORCE_DIALOG_AUTH,
new LoginDialogListener());
如果设备上安装了官方Facebook应用,则会强制您的应用不使用SSO。但必须有一个更好的解决方案,因为有些应用程序使用sso与官方的Facebook应用程序。
答案 1 :(得分:1)
这是因为当您登录Facebook帐户时,您的登录会话将在设备中创建。完成任务后,您必须从Facebook注销。
答案 2 :(得分:0)
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) {
}
}
可能是这段代码可以帮到你。如果有任何问题,请立即询问。