2013-06-24 43 views
9

我已经实现了Facebook登录,并且它在某些设备/ AVD上正常工作。我的开发设备是一个姜饼手机,但用4.1.1设备进行测试,它根本不会登录。按下Facebook按钮后,它会显示一个空白屏幕(尝试连接Facebook),1-2秒钟后回到主屏幕。此外,没有错误在Logcat中被烘烤或显示。哦,Facebook应用程序安装在设备中...任何想法?某些设备上的Facebook登录失败

UPDATE:

我启用了日志记录由马克Venzke在每次登录尝试提出并使用this过程中,我得到了这样的警告(两次)(注:用的HTC One的电话测试):

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声望赏金!

UPDATE 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. 
+0

[强调,模式]有时候你刚才假设Facebook的SDK(至少是最新的)是真的该死的车,会崩溃很多。你使用哪个SDK? – StErMi

+0

是的!我发现Facebook在移动方面并不擅长,一般来说(他们自己的应用也吸引了很多)......我使用的是最新的sdk,它似乎是v3.0.1。如果这是sdk的bug,它已经在那里三个月了! –

+0

当FB本地应用程序安装在手机上时,SDK的工作方式不同。您是否考虑过这种情况? – Umair

回答

6

您的股票应用程序和SDK之间肯定存在冲突。所以,如果你不想uninnstall股票宏达的应用程序,仍然使用SDK 3.0我认为你最好的选择,而不是体验sdk的源代码将是禁用SSO和登录只能通过webview。

这可以通过每次尝试打开新会话时添加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

+0

+1出现同样的问题。感谢您指出与HTC股票应用程序的冲突。我通过在facebook的LoginButton实例上设置行为来实现它:'authButton.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO)' – akhyar

4

雪莉Facebook登录不破所有4.1.1设备,所以它是有事情和实现。

是否确定Key Hash在该设备上与您在developer.facebook.com上配置的设备相同?如果您使用了不同的开发密钥,或者它是由第三方商店安装的,则密钥哈希可能不匹配。

打开Facebook SDK源代码中的调试日志记录并重建它。出于安全原因,它通常默认关闭。根据您的SDK版本,它可能位于Util.java或其他位置,可能是一个名为'ENABLE_LOG'的变量。

+0

要走的路!现在我看到我收到了一个htc错误! –

1

您的问题没有足够的信息。所以,我在这里做了一些猜测。

1)先看一下Mike Venzke的回答。

2)如果这不起作用,请尝试以下操作: 您需要使用SSO(单点登录)登录设备。所以这里是你可以采取的步骤。

删除构建。重新安装它。当被问及设备的权限时,允许他们。

如果不采取回到你的应用程序,那么你需要将这些添加到您的清单文件:

<activity 
     android:name="com.facebook.LoginActivity" 
     android:label="@string/app_name" > 
    </activity> 
<meta-data android:value="@string/app_id" android:name="com.facebook.sdk.ApplicationId"/> 

其中APP_NAME和APP_ID是你们各自的应用ID和应用程序名称您的Facebook应用程序页面上。

你有没有添加这些btw?

你,如果你发布一些更多的信息,我可能会想这个问题需要这些权限以及

<uses-permission android:name="android.permission.WAKE_LOCK"/> 
<uses-permission android:name="android.permission.GET_ACCOUNTS"/> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

+0

我已经拥有了在清单中配置的所有内容(除前2个权限外,尽管我添加了它们并获得了相同的行为)。另外,请注意,这实际上是在我通常的设备(中兴Skate,姜饼)中工作。我更新了这篇文章,我得到了一个看似HTC特定错误的东西(不适用于HTC One S)。 –

2

我认为Facebook的登录错误大多发生,所以要解决这个问题,你在那里遵循教程一步一步耐心地再次。

其他方面很难解决你的问题。所以你可以参考这个链接。

http://developers.facebook.com/android/

我希望你会成功。

1

我觉得你的Facebook的Android应用程序在设备的问题。因此,首先从设备上卸载Facebook的Android应用程序,并检查Facebook登录工作是否正常。

+0

不是。测试2个HTC One S设备,两者都给出相同的结果 –

1

由于Honeycomb无法在主线程上进行互联网调用,因此请尝试使用Android AsyncTask或自行创建新线程。

http://developer.android.com/reference/android/os/AsyncTask.html

+0

RequestAsyncTask(查看代码)是理论上运行在AsyncTask上的Facebook类,因此网络调用不应该在UI线程中执行 –

+0

嗯,也许它会帮助,但无论如何,发现com.htc.socialnetwork.facebook是一些HTC设备的股票Facebook和删除它,并从Play商店安装也许会帮助你... –

+0

你是什么意思与“com.htc.socialnetwork .facebook是一些HTC设备的股票Facebook“?那么,从Google Play上卸载并重新安装Facebook应该可以解决这个问题吗? –

0

我用一个老版本的Facebook的设备时得到这个错误。完全删除Facebook,或更新Facebook应用程序修复它。

我很确定会发生这种情况,因为Facebook for Android曾经只是一个包装的WebView的移动网站。

另外请注意,如果您尝试删除它,某些设备(我令人难以置信的4G LTE)将重新安装Facebook的旧版(web视图)版本。

0

将设备连接到eclipse以查看logcat。如果log cat没有在windows中运行open cmd提示符并运行adb restart,(首先设置adb路径)。那么你可以看到logcat运行。现在打开你的应用程序并点击Facebook登录按钮。您可以在日志猫中以黄色获得正确的哈希键。把这个键放在脸书上,现在Facebook登录将在每个设备上工作。谢谢。

0
List<String> permissions = new ArrayList<String>(); 
permissions.add("email"); 



//start Facebook session 
openActiveSession(this, true, new Session.StatusCallback() { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     if (session.isOpened()) { 
      //make request to the /me API 

      Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { 
       @Override 
       public void onCompleted(GraphUser user, Response response) { 
        if (user != null) { 
         String firstName = user.getFirstName(); 
         String lastName = user.getLastName(); 
         String id = user.getId(); 
         String email=null; 
         try { 
          email = user.getProperty("email").toString(); 
         } catch (Exception e) { 
          // TODO: handle exception 
         } 

         String gender = (String) user.getProperty("gender"); 
         String birthday = user.getBirthday(); 



        //welcome.setText("Hello \n" + firstName+"\n"+lastName+"\n"+email+"\n"+gender+"\n"+birthday+"!"); 




        if(firstName!=null) 
        { 


          SharedPreferences.Editor editor = settings.edit(); 

          editor.putString("fligin", "1"); 
          editor.putString("firstName", firstName); 
          editor.putString("lastName", lastName); 
          editor.putString("email", email); 
          editor.putString("gender", gender); 
          editor.putString("birthday", birthday); 
          editor.commit(); 

         Intent intent=new Intent(getApplicationContext(), RegistrationOneActivity.class); 
         startActivity(intent); 
         //overridePendingTransition(R.anim.slide_in_up, R.anim.slide_out_up); 

         finish(); 
        } 
        else { 

         Toast.makeText(getApplicationContext(),"Person information is null", Toast.LENGTH_SHORT).show(); 

        finish(); 
         } 



        } 
       } 
      }); 
     } 
    } 
}, permissions); 
0

尝试插入这条线,你在Java源代码中定义你的登录按钮

LoginButton fb_button = (LoginButton)findViewById(//your resource id); 
fb_button.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO); 
+0

尝试在两行前插入4个空格来格式化代码。 – DanM7

相关问题