我已经实现了 Facebook 登录,它在某些设备/AVD 上运行良好。我的开发设备是 Gingerbread 手机,但用 4.1.1 设备测试它,它根本无法登录。按下 facebook 按钮后,它显示黑屏(尝试连接 Facebook),1-2 秒后它返回主屏幕。此外,不会在 Logcat 中烘烤或显示任何错误。哦,Facebook 应用程序安装在设备中......有什么想法吗?
更新:
我按照 Mark Venzke 的建议启用了日志记录并使用 this程序,我在每次登录尝试时都收到此警告(两次)(注意:使用 HTC One S 手机进行测试):
07-05 20:14:50.582: W/PackageManager(605): Unable to load service info ResolveInfo{4171dbf0 com.htc.socialnetwork.facebook.remote.FacebookSyncService p=0 o=0 m=0x108000}
请注意 com.htc.socialnetwork.facebook.remote.FacebookSyncService 行,HTC 设备是否需要任何额外步骤?
此外,我附上了执行登录的代码:
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
if (isResumed) {
FragmentManager manager = getSupportFragmentManager();
int backStackSize = manager.getBackStackEntryCount();
for (int i = 0; i < backStackSize; i++) {
manager.popBackStack();
}
com.facebook.Settings.addLoggingBehavior(LoggingBehavior.REQUESTS);
if (state.isOpened()) {
Bundle params = new Bundle();
params.putString("fields", "id");
params.putString("limit", "1");
Request request = new Request(Session.getActiveSession(), "me", params, HttpMethod.GET, new Callback()
{
@Override
public void onCompleted(Response response)
{
if (response != null)
{
Log.d("AuthGraphResponse", response.toString());
long id;
try {
id = response.getGraphObject().getInnerJSONObject().getLong("id");
app.setFacebookId(id);
Log.d("UserID", Long.valueOf(id).toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
}
});
RequestAsyncTask task = new RequestAsyncTask(request);
task.execute();
showFragment(AUTH, false);
} else if (state.isClosed()) {
showFragment(UNAUTH, false);
}
}
}
更新 2:
HTC 是否有可能将所有设备(或其中一些设备)中的默认 Facebook 应用程序的包名称重命名为 com.htc.socialnetwork.facebook(而不是 com.facebook.katana),这会导致这个冲突?我真的不认为卸载默认应用程序并从 Google Play 安装 Facebook 是一个可接受的解决方案(另外,我认为无法卸载默认应用程序)。
更新 3:
还没有解决。 19 小时奖励 100 声望赏金!
更新 4:
LogCat 的另一个有趣的行:
07-15 10:55:51.718: E/chromium(30475): external/chromium/net/disk_cache/stat_hub.cc:216: [0715/105551:ERROR:stat_hub.cc(216)] StatHub::Init - App com.facebook.katana isn't supported.
最佳答案
您的股票应用程序和 SDK 之间肯定存在冲突。因此,如果您不想卸载现有的 HTC 应用程序并仍然使用 SDK 3.0,我认为不修改 sdk 源代码的最佳选择是禁用 SSO 并仅通过 webview 登录。
这可以通过在每次尝试打开新 session 时添加 SessionLoginBehavior.SUPRESS_SSO 轻松完成。这是我从 Facebook SDK 的 SessionLoginSample (LoginUsingActivityActivity) 更改而来的示例,向您展示该怎么做:
@Override
public void onCreate(Bundle savedInstanceState) {
...
Session session = Session.getActiveSession();
if (session == null) {
if (savedInstanceState != null) {
session = Session.restoreSession(this, null, statusCallback, savedInstanceState);
}
if (session == null) {
session = new Session(this);
}
Session.setActiveSession(session);
//add the check, for if session is opened
if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED) || !session.getState().isOpened()) {
//Add the suppress SSO behavior to force webview auth dialog to popup
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO));
}
}
...
}
//then put your code in the statusCallback method or keep it in the session state change listener
否则如果你不介意更改facebook sdk代码,你应该检查this出
关于android - 某些设备上的 Facebook 登录失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17278509/