我已经实施了Facebook登录,它在一些设备/ AVDs上正常工作.我的开发设备是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是否有可能在com.htc.socialnetwork.facebook(而不是com.facebook.katana)的所有设备(或其中一些,无论如何)重命名默认Facebook应用程序的包名称,并导致此冲突?我不认为卸载默认应用程序并从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之间确实存在冲突.所以,如果你不想uninsstall股票HTC应用程序,仍然使用SDK 3.0我认为你最好的打赌而不修改sdk的源代码将是禁用SSO和只通过webview登录.
每次尝试打开新会话时,可以通过添加SessionLoginBehavior.SUPRESS_SSO轻松完成此操作.以下是从SDK 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