Android-приложение с Facebook Login не работает на других телефонах, кроме моего

Не могу понять, почему мое приложение для Android с входом через Facebook (SDK 3.6) работает только с моим телефоном. И под этим я подразумеваю, что он не пройдет мимо активности входа в систему. Когда другой человек пытается протестировать приложение (запустив его в Eclipse), он нажимает кнопку «Войти через Facebook», и приложение запрашивает у него разрешение на доступ к его информации в Facebook. Когда они нажимают «ОК», он возвращает его к действию входа в систему, как будто ничего не произошло.

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

Я думаю, что когда я передал все файлы проекта другому человеку для проверки, в нем все еще была зарегистрирована моя Session информация? Кстати, две разные учетные записи Facebook.

Я генерирую keyhash во время работы программы. Блок кода находится там.

Код входа в систему

public class LoginActivity extends Activity {

private static final int HTTP_RESPONSE_SUCCESS = 200;

private Preferences prefs;
public List<GraphUser> fbFriends;

private UiLifecycleHelper uiHelper;
private Session.StatusCallback callback = new Session.StatusCallback() {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        onSessionStateChange(session, state, exception);
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    getActionBar().setTitle("");

    uiHelper = new UiLifecycleHelper(this, callback);
    uiHelper.onCreate(savedInstanceState);

    prefs = new Preferences(this);

    getKeyHash();
}

private void goToMainActivity() {
    Intent intent = new Intent(this, MainActivity.class);
    startActivity(intent);
}

private void getKeyHash() {
    try {
        PackageInfo info = getPackageManager().getPackageInfo("com.walintukai.derpteam", 
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.i("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    } 
    catch (NameNotFoundException e) { } 
    catch (NoSuchAlgorithmException e) { }
}

private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    if (session.isOpened()) {
        Request.newMeRequest(session, new Request.GraphUserCallback() {
            @Override
            public void onCompleted(GraphUser user, Response response) {
                if (user != null) {
                    prefs.setFbUserId(user.getId());
                    prefs.setFbUserName(user.getName());
                    Log.i("FB LOGIN", user.getName());
                }
            }
        }).executeAsync();

        requestFacebookFriends(Session.getActiveSession());
        goToMainActivity();
    }
    else if (session.isClosed()) {
        Log.i("FB LOGOUT", "");
        prefs.setFbUserId("");
        prefs.setFbUserName("");
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    uiHelper.onActivityResult(requestCode, resultCode, data);
}

private void requestFacebookFriends(Session session) {
    Request friendsRequest = createRequest(session);
    friendsRequest.setCallback(new Request.Callback() {
        @Override
        public void onCompleted(Response response) {
            fbFriends = getResults(response);

            JSONWriter writer = new JSONWriter(LoginActivity.this);
            writer.updateFriendsList(fbFriends);
            writer.logJson("friends.json");

            new PostToServerTask().execute();
        }
    });
    friendsRequest.executeAsync();
}

private Request createRequest(Session session) {
    Request request = Request.newGraphPathRequest(session, "me/friends", null);

    Set<String> fields = new HashSet<String>();
    String[] requiredFields = new String[] {"id", "name"};
    fields.addAll(Arrays.asList(requiredFields));

    Bundle parameters = request.getParameters();
    parameters.putString("fields", TextUtils.join(",", fields));
    request.setParameters(parameters);

    return request;
}

private List<GraphUser> getResults(Response response) {
    GraphMultiResult multiResult = response.getGraphObjectAs(GraphMultiResult.class);
    GraphObjectList<GraphObject> data = multiResult.getData();
    return data.castToListOf(GraphUser.class);
}

private class PostToServerTask extends AsyncTask<Void, Void, Void> {
    private int responseCode;

    protected Void doInBackground(Void... params) {
        HttpPostRequest post = new HttpPostRequest(LoginActivity.this);
        post.createPost();
        post.addJSON("friends.json");
        responseCode = post.sendPost();
        return null;
    }

    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        if (responseCode == HTTP_RESPONSE_SUCCESS ) { Log.i("POST TO SERVER", "SUCCESS"); }
        else { Log.e("POST TO SERVER", "ERROR"); }
        return;
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    uiHelper.onDestroy();
}

@Override
protected void onPause() {
    super.onPause();
    uiHelper.onPause();
}

@Override
protected void onResume() {
    super.onResume();
    uiHelper.onResume();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    uiHelper.onSaveInstanceState(outState);
}

}


person The Nomad    schedule 21.02.2014    source источник
comment
Я помню, когда мне пришлось иметь дело с FB API, мне пришлось сделать свой ключ открытым для других... Может ли это быть проблемой, с которой вы столкнулись? Я не думаю, что если вы жестко не запрограммируете его в свой исходный код, он сможет сохранить состояние через apk...   -  person Joe Packer    schedule 22.02.2014
comment
@JoePacker, как ты открыл ключ для других? После прочтения документации по хэшам ключей, только разработчик должен добавить хэш на странице разработчика FB. Пробовал раздавать только APK, но на других телефонах не работает.   -  person The Nomad    schedule 23.02.2014
comment
если вы перейдете в раздел «Приложения» › «Настройки» › «Дополнительно», просмотрите раздел токена клиента и убедитесь, что вы включили все настройки, необходимые для того, чтобы сделать это приложение доступным.   -  person Joe Packer    schedule 24.02.2014


Ответы (3)


Вы упустили одну вещь. Перейдите на страницу https://developers.facebook.com, выберите свое приложение -> Настройки -> Блокировать Android и добавьте ключевые хэши для других компьютеров (проверьте https://developers.facebook.com/docs/android/getting-started/ для получения подробной информации)
введите здесь описание изображения

Чтобы получить хэш, выполните keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64 для Mac OS
и keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64 для Windows.

person rocknow    schedule 21.02.2014
comment
У меня есть метод, который генерирует хеш-ключ выше в моем коде -›getKeyHash. Разве это не будет работать так же, потому что это работает для моей учетной записи? Я также добавил ключевой хэш других тестировщиков в учетную запись разработчика Facebook. - person The Nomad; 22.02.2014
comment
Я проделал и этот способ и получил такой же keyhash как тот, что генерируется в самой программе. Все еще не работает для других людей, которые тестируют APK. - person The Nomad; 23.02.2014
comment
@TheNomad попробуйте собрать apk на свой компьютер и запустить его на нескольких устройствах. Если проблема не в хэше, она будет работать - person rocknow; 23.02.2014

Все, что мне нужно было сделать, это удалить приложение из Sandbox Mode. Задача решена!

person The Nomad    schedule 23.02.2014
comment
что такое режим песочницы - person Maher Ismaail; 20.06.2015
comment
@MaherIsmaail Выход из режима песочницы позволит любому пользователю использовать приложение. Не только люди на странице ролей. Перейдите к своему приложению на панели разработчика Facebook › нажмите «Статус и обзор» › Хотите сделать это приложение и все его функции доступными для широкой публики? ДА - person The Nomad; 21.06.2015
comment
@TheNomad, доступный для широкой публики, означает, как публика может увидеть это приложение или получить к нему доступ? Что это значит? - person cgr; 04.01.2016

Это проблема, ваше приложение facebook не является общедоступным. Вы должны щелкнуть меню «Статус и обзор» на сайте https://developers.facebook.com/apps/. Затем задайте вопрос: «Хотите ли вы сделать это приложение и все его живые функции доступными для широкой публики?» ответьте "ДА" и сохраните. это все.

person developerturk    schedule 09.01.2015