Подтвердить что ты не робот

If (session.isOpen()), facebook login на android всегда возвращает false

Я пытаюсь реализовать простую деятельность в моем приложении Android, где пользователю предлагается войти в систему через facebook, чтобы пользователь "понравился". Поэтому, очевидно, сначала я тестирую простой логин через facebook. Я использую точный код, который они имеют в разделе "Начало работы с Facebook SDK для Android" - Шаг 6 (https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/), но по какой-то причине он не работает. Когда я отлаживал код, я понял, что следующее условие:

if(session.isOpen()) 

ВСЕГДА возвращает false, даже если я уже войду в facebook. Я пробовал все, чтобы исправить это, но ничего не работает.

У кого-нибудь была эта проблема или она знает, как ее исправить?

РЕДАКТИРОВАТЬ: Я пробую этот тест на своем телефоне напрямую не на эмуляторе. Я не знаю, может ли это быть проблемой.

Спасибо заранее!

И я попробовал это решение session.isOpened() возвращает false, даже если успешно зарегистрировался в Facebook, но с использованием java 6 или 7 по-прежнему выдавался тот же хеш-ключ.

РЕДАКТИРОВАТЬ 2: Я тоже пробовал то же самое, но с немного другим подходом. http://sonyarouje.com/2011/09/18/facebook-hash-key-for-android-apps/ У меня все еще такая же проблема. Метод session.isOpen() всегда возвращает false.

РЕДАКТИРОВАТЬ 3: Вот последний код, который я пробовал. Я не думаю, что в логарифме есть ошибки. В любом случае, я свяжу его здесь на всякий случай, если я что-то упустил.

package com.example.danandroidapp;
import java.util.Arrays;

import com.facebook.FacebookException;
import com.facebook.Request;
import com.facebook.Response;
import com.facebook.Session;
import com.facebook.SessionState;
import com.facebook.model.GraphUser;
import com.facebook.widget.LoginButton;
import com.facebook.widget.LoginButton.OnErrorListener;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {

    private String TAG = "MainActivity";
    private TextView lblEmail;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lblEmail = (TextView) findViewById(R.id.lblEmail);

        LoginButton authButton = (LoginButton) findViewById(R.id.authButton);

        authButton.setOnErrorListener(new OnErrorListener() {
            @Override
            public void onError(FacebookException error) {
                Log.i(TAG, "Error " + error.getMessage());
            }
        });

        authButton.setReadPermissions(Arrays.asList("basic_info", "email"));
        authButton.setSessionStatusCallback(new Session.StatusCallback() {

        @Override
        public void call(Session session, SessionState state, Exception exception) {
            if(session.isOpened()) {
                Log.i(TAG, "Access Token " + session.getAccessToken());
                Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

                    @Override
                    public void onCompleted(GraphUser user, Response response) {
                        if(user != null) {
                            Log.i(TAG, "User ID " + user.getId());
                            Log.i(TAG, "Email " + user.asMap().get("email"));
                            lblEmail.setText(user.asMap().get("email").toString());
                        }
                    }
                });
            }
        }
    });
}

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

И мой вывод logcat: https://www.dropbox.com/s/7qg9zbhlpikfovf/log.txt

4b9b3361

Ответ 1

У меня была аналогичная проблема: хэш-код был неправильным в facebook, следуя приведенному ниже коду, вы можете получить хеш-ключ, который был отправлен на facebook. Просто скопируйте этот хэш и замените его. Он начнет работать.

    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "your.root.package", 
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
    } catch (NameNotFoundException e) {

    } catch (NoSuchAlgorithmException e) {

    }

Ответ 2

Вам не хватает переопределения onActivityResult (последний бит фрагмента кода в Руководстве по началу работы).

OnActivityResult - это то, как информация возвращается из приложения FB (или веб-просмотра) обратно в ваше приложение и должна быть переопределена, чтобы перезвонить в сеанс.

Ответ 3

private Session.StatusCallback statusCallback = new SessionStatusCallback();

private class SessionStatusCallback implements Session.StatusCallback {
    @Override
    public void call(final Session session, SessionState state,
            Exception exception) {

        try {
            new_session = session;
            if (state.equals(SessionState.OPENING)) {

            }

            if (state.equals(SessionState.OPENED)) {


            }

            if (state.equals(SessionState.CLOSED_LOGIN_FAILED)) {
                try {
                    PackageInfo info = context.getPackageManager()
                            .getPackageInfo("your package name",
                                    PackageManager.GET_SIGNATURES);
                    for (Signature signature : info.signatures) {
                        MessageDigest md = MessageDigest.getInstance("SHA");
                        md.update(signature.toByteArray());
                        Log.d("KeyHash:", Base64.encodeToString(
                                md.digest(), Base64.DEFAULT));
                    }
                    Session.openActiveSession((Activity) context, true,
                            statusCallback);
                } catch (NameNotFoundException e) {

                } catch (NoSuchAlgorithmException e) {

                }
            }

            if (state.equals(SessionState.OPENED_TOKEN_UPDATED)) {



            }

    }
    catch(Exception e){}
  }
}

//if session is closed
Session.openActiveSession((Activity) context, true,
                    statusCallback);

Ответ 4

Вы должны добавить хэш ключа в разработчике Facebook, он работает для меня