一些设备上Facebook登录失败

9
我已经实现了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.

是的!我看到Facebook在移动端上并不是很好,总的来说(他们自己的应用程序也很糟糕)...我正在使用最新的SDK,似乎是v3.0.1。如果这是SDK的一个错误,那么它已经存在了3个月! - Dhanesh Budhrani
你需要发布代码,这样人们才能提供相关的答案。 - yams
哎呀,忘了在这里宣布了,我更新了问题 :) - Dhanesh Budhrani
你能提供Facebook SDK日志输出的其余部分吗(删除任何个人数据)?FacebookSyncService行可能与此无关,或者至少其他信息将有助于提供上下文。 - Mike Venzke
好的,我会翻译,但是明天再翻(我现在没有那部手机)。无论如何,今天我注意到另一行有趣的logcat是:E/chromium(30475): external/chromium/net/disk_cache/stat_hub.cc:216: [0715/105551:ERROR:stat_hub.cc(216)] StatHub::Init - 应用程序com.facebook.katana不受支持。 - Dhanesh Budhrani
显示剩余4条评论
10个回答

6
肯定存在您的股票应用程序和SDK之间的冲突。因此,如果您不想卸载HTC股票应用程序并仍然使用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代码,您应该查看这个

+1 我也遇到了同样的问题。感谢指出与HTC股票应用程序的冲突。我通过在Facebook的LoginButton实例上设置行为来使其工作:authButton.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO) - akhy

4

Shirley,Facebook登录在所有4.1.1设备上都没有问题,因此这可能与您的实现有关。

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

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


2

我认为Facebook登录错误大多发生在应用程序中,要解决这个问题,您需要耐心地按照他们的教程一步一步地再次进行操作。

否则,在这里解决您的问题将非常困难。因此,您可以参考此链接。

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

我希望您能成功。


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分别是您在Facebook应用程序页面上的应用程序ID和应用程序名称。

顺便问一下,您是否已添加了它们?

您还需要这些权限。

<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" />

如果您发布更多信息,我可能会猜测问题所在。

我已经在清单中配置了所有内容(除了前两个权限,但我已添加它们并获得了相同的行为)。此外,请注意,这实际上在我的常用设备(ZTE Skate,Gingerbread)上运行。我更新了帖子,我正在遇到似乎是HTC特定错误的问题(在HTC One S上无法工作)。 - Dhanesh Budhrani

1

我认为你的Facebook安卓应用在设备上存在问题。因此,请先从设备中卸载Facebook安卓应用,并检查Facebook登录是否正常工作。


不行。在两个HTC One S设备上测试,结果都是一样的。 - Dhanesh Budhrani

1

RequestAsyncTask(查看代码)是Facebook的一个类,理论上在AsyncTask上运行,因此网络调用不应该在UI线程中进行。 - Dhanesh Budhrani
也许这会有所帮助,但是我发现com.htc.socialnetwork.facebook是某些htc设备的预装Facebook应用。如果你将其删除并从Play商店重新安装,也许会有所帮助... - Thiago Romano
你的意思是“com.htc.socialnetwork.facebook 是某些 HTC 设备的原生 Facebook”吗?那么,从 Google Play 卸载并重新安装 Facebook 应该可以解决这个问题吗? - Dhanesh Budhrani
抱歉,我不太确定了,但可能问题出在您的Facebook for HTC服务上,请尝试清除数据或删除同步帐户,这可能会从您的联系人中删除朋友的照片,但可能有所帮助。 - Thiago Romano

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);

尝试在这两行代码前插入4个空格以格式化代码。 - DanM7

0

当我使用一个旧版本的Facebook设备时,出现了这个错误。完全删除Facebook或更新Facebook应用程序可以解决它。

我相信这是因为Android版Facebook过去只是移动站点的包装WebView。

还要注意,如果您尝试删除它,某些设备(如我的Incredible 4G LTE)将重新安装旧版(webview)的Facebook。


0

连接设备到Eclipse以查看Logcat。如果Logcat未运行,请在Windows中打开CMD提示符并运行adb restart(先设置adb路径)。然后您可以看到Logcat正在运行。现在打开您的应用程序并单击Facebook登录按钮。您可以在Logcat中以黄色显示获取正确的哈希键。将该密钥放在Facebook上,现在Facebook登录将在每个设备上工作。谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接