在Android SDK中打开Facebook个人资料

时间:2015-04-04 21:34:22

标签: android facebook facebook-graph-api

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

点击ImageButton时,我试图打开用户的Facebook个人资料页面。在查看this suggested method以获取更新的Facebook应用程序版本后,它主要工作,但朋友与登录用户(在应用程序中)的用户除外,或者登录用户自己。

过程是:

  1. 单击图像按钮
  2. 致电Facebook Graph API,通过他们的Facebook ID(存储在我们的数据库中)获取用户个人资料的链接
  3. 通过检查是否安装了Facebook应用并生成正确的Uri来创建新的Intent
  4. 使用生成的Activity
  5. 启动新的Intent

    由于我们正在使用Facebook Graph API v2.0,因此会从JSON中的username对象中删除GraphUser字段。问题是Facebook链接(GraphUser.getLink())是:

    1. 如果用户(已登录应用)与我们正在尝试查看其个人资料的用户的朋友,则应用范围(受保护)链接;格式为:https://www.facebook.com/app_scoped_user_id/{protected-id}
    2. A' normal' Facebook链接用户的真实身份(不受保护);格式为:http://www.facebook.com/{real-user-id}
    3. 真正的问题是,在安装应用程序时,Facebook Uri 需要:

      1. 应用范围链接
      2. 附有 username 的链接, {user-id}
      3. 但是,网络版(在网络视图中打开)并不关心。该链接可以是应用范围,基于用户名或基于ID。因此WebView s

        的所有都可以

        由于图谱API v2.0中完全无法访问username,因此我只获得null值,这意味着对于 Facebook应用,我可以&# 39;生成它所期望的正确的Uri(基于用户名),仅基于id或应用范围。

        以下是我用来创建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);
        }
        

        这是onClick()上的ImageButton方法:

        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,否则网络视图会按原样处理。

        所以问题:如何通过id为Facebook应用获取Facebook用户名?或者,使用 ids 而不是用户名是否有Facebook应用所期望的Uri

1 个答案:

答案 0 :(得分:1)

您应该能够使用fb://个人资料/ {user-id}网址格式来启动原生应用。这将允许您使用用户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对象。