在 Android SDK 中打开 Facebook 个人资料

Open Facebook Profile in Android SDK

注意:此问题仅在安装 Facebook 应用程序时出现

我正在尝试在单击 ImageButton 时打开用户的 Facebook 个人资料页面。在查看 this suggested method 以了解更多最新的 Facebook 应用程序版本后,它大部分工作正常,但与登录用户(在应用程序中)成为 好友 的用户除外,或者用户自己登录。

过程是:

  1. 图片按钮被点击
  2. 调用 Facebook Graph API 是为了通过用户的 Facebook ID(存储在我们的数据库中)link 获取用户的个人资料
  3. 通过检查是否安装了 Facebook 应用程序并生成正确的 Uri
  4. 创建了一个新的 Intent
  5. 一个新的 Activity 使用生成的 Intent
  6. 开始

因为我们使用的是 Facebook Graph API v2.0,username 字段已从 JSON 中的 GraphUser 对象中删除。问题是 Facebook link (GraphUser.getLink()) 是:

  1. 应用范围内(受保护)link 如果用户(登录应用)与我们试图查看其个人资料的用户不是朋友;格式为:https://www.facebook.com/app_scoped_user_id/{protected-id}
  2. A 'normal' Facebook link 具有用户的真实 ID(未受保护);格式为:http://www.facebook.com/{real-user-id}

真正的问题是 Facebook Uri 安装应用程序时 期望:

  1. 一个应用范围的 link
  2. A link 附有 usernamenot {user-id}

然而,网络版(在网络视图中打开)并不关心。 link 可以是应用范围的、基于用户名的或基于 ID 的。所以一切 工作 WebViews.

由于 username 在 Graph API v2.0 中完全无法访问,我只得到 null 值,这意味着对于 Facebook 应用程序 我无法生成它期望的正确 Uri(基于用户名),只能生成基于 id 或应用范围的 Uri。

这是我用来创建 Intent:

的代码
public static Intent getFacebookIntent(String facebookProfileUrl) {
    PackageManager pm = App.getContext().getPackageManager();
    Uri uri;
    try {
        pm.getPackageInfo("com.facebook.katana", 0);
        uri = Uri.parse("fb://facewebmodal/f?href=" + facebookProfileUrl);
    } catch (PackageManager.NameNotFoundException e) {
        uri = Uri.parse(facebookProfileUrl);
    }
    return new Intent(Intent.ACTION_VIEW, uri);
}

这是我在 ImageButton:

上的 onClick() 方法
new Request(
        Session.getActiveSession(),
        String.valueOf(mate.getFacebookId()),
        null,
        HttpMethod.GET,
        new Request.Callback() {
            public void onCompleted(Response response) {

                GraphUser g = response.getGraphObjectAs(GraphUser.class);

                String fbUrl = g.getLink();
                // TODO: If link does not contain 'scoped', need USERNAME, not ID

                String otherUrl = "https://www.facebook.com/" + myAppUser.getId();

                String finalUrl = (fbUrl.contains("scoped")) ? fbUrl : otherUrl;

                Intent intent = getFacebookIntent(finalUrl);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
        }
    ).executeAsync();

如果安装了该应用程序,我需要 username,否则网络视图会按应有的方式处理它。

所以问题是:如何通过 Facebook 应用程序的 ID 获取 Facebook 用户名?或者,Facebook 应用程序是否有不同的 Uri 我可以使用 ids 而不是用户名?

您应该能够使用 fb://profile/{user-id} URL 格式来启动本机应用程序。这将允许您使用用户 ID 而不是用户名。您可以将 getFacebookIntent 方法重写为:

public Intent getFacebookIntent(GraphUser user) {
    PackageManager pm = this.getPackageManager();
    Uri uri;
    try {
        pm.getPackageInfo("com.facebook.katana", 0);
        uri = Uri.parse("fb://profile/" + user.getId());
    } catch (PackageManager.NameNotFoundException e) {
        uri = Uri.parse(user.getLink());
    }
    return new Intent(Intent.ACTION_VIEW, uri);
}

然后您可以调用此方法并传入 GraphUser 对象。