Ошибка входа в Facebook на некоторых устройствах

я реализовал логин Facebook, и он отлично работает на некоторых устройствах/AVDs. Мое устройство разработки-это пряничный телефон, но тестируя его с помощью устройства 4.1.1, он просто не входит в систему. После нажатия кнопки facebook отображается пустой экран (попытка подключения Facebook), а через 1-2 секунды он возвращается на главный экран. Кроме того, никакие ошибки не поджариваются или не отображаются в Logcat. О, и приложение Facebook установлено в устройстве... Любой идеи?

обновление:

Я включил ведение журнала, как предложил Марк Венцке и используя этой процедура, и я получил это предупреждение (дважды) при каждой попытке входа в систему (Примечание: тестирование с телефоном 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.фейсбук.дистанционный.Линия 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 из Google Play является приемлемым решением (кроме того, я думаю, что приложения по умолчанию не могут быть удаленный.)

обновление 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.

10 ответов


существует, безусловно, конфликт между вашим приложением stock и SDK. Поэтому, если вы не хотите uninnstall приложение HTC и по-прежнему использовать SDK 3.0, я думаю, что лучше всего без изменения исходного кода sdk было бы отключить SSO и войти только через webview.

Это можно легко сделать, добавив SessionLoginBehavior.SUPPRESS_SSO каждый раз, когда вы пытаетесь открыть новый сеанс. Вот пример, который я изменил из SessionLoginSample (LoginUsingActivityActivity) из Facebook SDK, чтобы показать вам, что делать :

@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, вы должны проверить этой из


Shirley Facebook login не сломан на всех устройствах 4.1.1, поэтому это что-то с вашей реализацией.

вы уверены, что хэш ключа на этом устройстве совпадает с тем, что вы настроили на developer.facebook.com? Если вы использовали другой ключ dev или он был установлен сторонним магазином, возможно, хэши ключей не совпадают.

включить ведение журнала отладки в исходном коде Facebook SDK и перестроить его. По умолчанию он выключен по соображениям безопасности. В зависимости от вашей версии SDK, он может быть в Util.java или какое-либо другое место, и может быть переменной под названием 'ENABLE_LOG'.


Я думаю, что ошибка входа в facebook в основном происходит так, чтобы решить эту проблему, вы следуете там учебник шаг за шагом снова с терпением.

другие мудрые его очень трудно решить ваши проблемы. Таким образом, вы можете ссылаться на эту ссылку.

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

Я надеюсь, что вы будете успеха.


в вашем вопросе недостаточно информации. Итак, я делаю несколько предположений.

1) Сначала посмотрите на ответ Майка Венцке.

2) Если это не работает, попробуйте это: Вам нужно войти в устройство с помощью SSO (Single Sign On). Итак, вот шаги, которые вы можете предпринять.

удалить построение. переустановить ее. и когда вас попросят разрешения с вашего устройства, разрешите их.

Если вы не вернулись в свое приложение, вам нужно добавить их в свое файл манифеста:

<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.

вы добавили эти кстати?

вам нужно это разрешение, а также

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

Если вы опубликуете дополнительную информацию, я могу догадаться о проблеме.


Я думаю, что проблема с вашим приложением Facebook android в устройстве. Поэтому сначала удалите приложение facebook android с устройства и убедитесь, что логин facebook работает правильно или нет.


поскольку Honeycomb вы не можете совершать интернет-звонки в основном потоке, попробуйте использовать Android AsyncTask или создать новый поток самостоятельно.

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


Я получил эту ошибку при использовании устройства со старой версией facebook. Удаление facebook полностью или обновление приложения facebook исправлено.

Я уверен, что это происходит потому, что Facebook для Android было просто завернуто WebView с мобильного сайта.

также обратите внимание, что некоторые устройства (мой невероятный 4G LTE) переустановит старую (webview) версию facebook, если вы попытаетесь удалить его.


подключите устройство к eclipse, чтобы увидеть logcat. если log cat не запускает приглашение open cmd в windows и запускает перезапуск adb, (сначала установите путь adb). затем вы можете увидеть logcat работает. теперь откройте приложение и нажать на кнопку входа в facebook. вы можете получить правильный хэш-ключ в желтом цвете в log cat. поместите этот ключ на facebook, и теперь Facebook login будет работать на каждом устройстве. спасибо.


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

попробуйте вставить эту строку, где вы определяете кнопку входа в исходный код java

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