Приложението за Android с влизане във Facebook не работи за други телефони освен моя

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

Все още съм във фаза на разработка, така че се опитвам да тествам приложението чрез .

Мисля си, че когато дадох всички файлове на проекта на другия човек за тестване, той все още има моята Session информация влязла? Два различни акаунта във Facebook между другото.

Генерирам keyhash, докато изпълнявам програмата. Блокът от код е там.

Код на LoginActivity

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
ако отидете в apps › settings › advanced вижте раздела за клиентски токени и се уверете, че сте активирали всички настройки, от които се нуждаете, за да направите това приложение достъпно   -  person Joe Packer    schedule 24.02.2014


Отговори (3)


Пропуснал си едно нещо. Отидете на https://developers.facebook.com, изберете вашето приложение -> Настройки -> Android block и добавете ключови хешове за други компютри (проверете 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 на вашия компютър и да го стартирате на няколко устройства. Ако проблемът не е в keyhash, ще работи - person rocknow; 23.02.2014

Всичко, което трябваше да направя, беше да извадя приложението от Sandbox Mode. Проблема решен!

person The Nomad    schedule 23.02.2014
comment
какво е Sandbox Mode - 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