在 Android SDK 中打开 Facebook 个人资料
Open Facebook Profile in Android SDK
注意:此问题仅在安装 Facebook 应用程序时出现。
我正在尝试在单击 ImageButton
时打开用户的 Facebook 个人资料页面。在查看 this suggested method 以了解更多最新的 Facebook 应用程序版本后,它大部分工作正常,但与登录用户(在应用程序中)成为 好友 的用户除外,或者用户自己登录。
过程是:
- 图片按钮被点击
- 调用 Facebook Graph API 是为了通过用户的 Facebook ID(存储在我们的数据库中)link 获取用户的个人资料
- 通过检查是否安装了 Facebook 应用程序并生成正确的 Uri
创建了一个新的 Intent
- 一个新的
Activity
使用生成的 Intent
开始
因为我们使用的是 Facebook Graph API v2.0,username
字段已从 JSON 中的 GraphUser
对象中删除。问题是 Facebook link (GraphUser.getLink()
) 是:
- 应用范围内(受保护)link 如果用户(登录应用)与我们试图查看其个人资料的用户不是朋友;格式为:
https://www.facebook.com/app_scoped_user_id/{protected-id}
- A 'normal' Facebook link 具有用户的真实 ID(未受保护);格式为:
http://www.facebook.com/{real-user-id}
真正的问题是 Facebook Uri 安装应用程序时 期望:
- 一个应用范围的 link
- A link 附有
username
,not {user-id}
然而,网络版(在网络视图中打开)并不关心。 link 可以是应用范围的、基于用户名的或基于 ID 的。所以一切 工作 WebView
s.
由于 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 对象。
注意:此问题仅在安装 Facebook 应用程序时出现。
我正在尝试在单击 ImageButton
时打开用户的 Facebook 个人资料页面。在查看 this suggested method 以了解更多最新的 Facebook 应用程序版本后,它大部分工作正常,但与登录用户(在应用程序中)成为 好友 的用户除外,或者用户自己登录。
过程是:
- 图片按钮被点击
- 调用 Facebook Graph API 是为了通过用户的 Facebook ID(存储在我们的数据库中)link 获取用户的个人资料
- 通过检查是否安装了 Facebook 应用程序并生成正确的 Uri 创建了一个新的
- 一个新的
Activity
使用生成的Intent
开始
Intent
因为我们使用的是 Facebook Graph API v2.0,username
字段已从 JSON 中的 GraphUser
对象中删除。问题是 Facebook link (GraphUser.getLink()
) 是:
- 应用范围内(受保护)link 如果用户(登录应用)与我们试图查看其个人资料的用户不是朋友;格式为:
https://www.facebook.com/app_scoped_user_id/{protected-id}
- A 'normal' Facebook link 具有用户的真实 ID(未受保护);格式为:
http://www.facebook.com/{real-user-id}
真正的问题是 Facebook Uri 安装应用程序时 期望:
- 一个应用范围的 link
- A link 附有
username
,not{user-id}
然而,网络版(在网络视图中打开)并不关心。 link 可以是应用范围的、基于用户名的或基于 ID 的。所以一切 工作 WebView
s.
由于 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 对象。