9

I have implemented the Facebook login and it works fine on some devices/AVDs. My development device is a Gingerbread phone, but testing it with a 4.1.1 device, it simply does not log in. After pressing the facebook button, it shows a blank screen (trying to connect Facebook), and after 1-2 seconds it comes back to the home screen. Also, no errors are toasted or displayed in the Logcat. Oh, and the Facebook application is installed in the device... Any ideas?

UPDATE:

I enabled logging as suggested by Mark Venzke and using this procedure, and I got this warning (twice) on every login attempt (note: testing with a HTC One S phone):

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}

Note the com.htc.socialnetwork.facebook.remote.FacebookSyncService line, so is there any extra step needed for HTC devices?

Also, I'm attaching the code where the login is performed:

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

UPDATE 2:

Is it possible that HTC renames the package name of the default Facebook application in all the devices (or some of them, whatever) to com.htc.socialnetwork.facebook (instead of com.facebook.katana) and it leads to this conflict? I don't really think that uninstalling the default app and installing Facebook from Google Play is an acceptable solution (also, I think default apps cannot be uninstalled).

UPDATE 3:

Not solved yet. 19 hours to award the 100 reputation bounty!

UPDATE 4:

Another interesting line of the 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.
4

10 回答 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 代码,您应该检查一下

于 2013-07-16T09:57:02.923 回答
4

Shirley Facebook 登录并没有在所有 4.1.1 设备上被破坏,所以它与您的实现有关。

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

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

于 2013-07-02T20:40:57.463 回答
2

我认为 facebook 登录错误大多发生,所以要解决这个问题,你需要耐心地按照教程一步一步地进行操作。

否则,在这里解决您的问题非常困难。所以你可以参考这个链接。

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

我希望你会成功。

于 2013-07-05T09:56:13.780 回答
1

由于 Honeycomb 您无法在主线程上进行 Internet 调用,请尝试使用 Android AsyncTask 或自己创建一个新线程。

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

于 2013-07-05T18:42:19.030 回答
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" />

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

于 2013-07-05T09:08:30.703 回答
1

我认为设备中的 Facebook android 应用存在问题。因此,首先从设备上卸载 facebook android 应用程序并检查 facebook 登录是否正常工作。

于 2013-07-05T12:55:15.947 回答
0

将设备连接到 Eclipse 以查看 logcat。如果 log cat 没有运行在 windows 中打开 cmd 提示符并运行 adb restart,(首先设置 adb 路径)。然后你可以看到 logcat 正在运行。现在打开您的应用程序并单击 facebook 登录按钮。您可以在 log cat 中获得正确的黄色哈希键。将该密钥放在 facebook 上,现在 facebook 登录将在每台设备上运行。谢谢。

于 2014-04-08T07:11:20.350 回答
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);
于 2014-07-01T10:27:35.940 回答
0

尝试在 java 源代码中定义登录按钮的位置插入这一行

LoginButton fb_button = (LoginButton)findViewById(//your resource id);
fb_button.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
于 2014-09-05T00:16:26.747 回答
0

使用带有旧版 facebook 的设备时出现此错误。完全删除 facebook,或更新 facebook 应用程序修复它。

我很确定会发生这种情况,因为 Android 版 Facebook 过去只是移动网站的封装 WebView。

另请注意,如果您尝试将其删除,某些设备(我的 Incredible 4G LTE)将重新安装旧的(webview)版本的 facebook。

于 2013-07-15T23:23:28.147 回答