注意:此问题仅在安装Facebook应用时出现 。
点击ImageButton
时,我试图打开用户的Facebook个人资料页面。在查看this suggested method以获取更新的Facebook应用程序版本后,它主要工作,但朋友与登录用户(在应用程序中)的用户除外,或者登录用户自己。
过程是:
Intent
Activity
Intent
醇>
由于我们正在使用Facebook Graph API v2.0,因此会从JSON中的username
对象中删除GraphUser
字段。问题是Facebook链接(GraphUser.getLink()
)是:
https://www.facebook.com/app_scoped_user_id/{protected-id}
http://www.facebook.com/{real-user-id}
真正的问题是,在安装应用程序时,Facebook Uri 需要:
username
的链接, 不 {user-id}
但是,网络版(在网络视图中打开)并不关心。该链接可以是应用范围,基于用户名或基于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 ?
答案 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对象。