Не удалось получить токен доступа для facebook на реальном устройстве

У меня была интеграция Facebook в моем проекте, все в порядке на эмуляторе. Когда дело доходит до запуска на реальном устройстве, оно не работает. Я думаю, проблема заключается в токене доступа к Facebook, я не знаю, что делать сейчас? Поэтому я не могу получить информацию о друзьях на реальном устройстве. Может кто-нибудь помочь мне, как получить токен доступа на реальном устройстве.

Я использую Android SDK только для получения информации о друзьях в Facebook.

mFacebook = new Facebook("api_id");
mFacebook.authorize(this, new String[] {
    "publish_stream", "read_stream", "offline_access", "friends_birthday", "user_birthday", "email", "read_friendlists", "manage_friendlists"
}, this);
sToken = mFacebook.getAccessToken();
public void onComplete(Bundle values) {
    Log.e("oncomplete", "value");
    if (values.isEmpty()) {
        Log.e("oncomplete", "value is empty");
        return;
    }
    if (!values.containsKey("POST")) {
        sToken = mFacebook.getAccessToken();
        getFriends()
    }
}
private void getFriends() {
    try {
        sToken = mFacebook.getAccessToken();
        StaticUtils.sResponseId = mFacebook.request("me/friends");
        Log.w("response", StaticUtils.sResponseId);
        try {
            JSONObject jObj = Util.parseJson(StaticUtils.sResponseId);
            JSONArray jArr = jObj.getJSONArray("data");
            for (int i = 0; i < jArr.length(); i++) {
                JSONObject jObjFren = jArr.getJSONObject(i);
                Iterator it = jObjFren.keys();
                while (it.hasNext()) {
                    String s = (String) it.next();
                    // Log.w("KEY",s);
                    String sname = jObjFren.getString(s);
                    if (s.equals("id")) {
                        StaticUtils.sFbId.add(sname);
                        StaticUtils.sFbPics.add(StaticUtils.sImgUrl + sname + "/picture");
                    } else if (s.equals("name")) {
                        StaticUtils.sFbName.add(sname.toLowerCase());
                    }
                }
            }
        } catch (JSONException e) {
            Log.w("json exception", e.toString());
        } catch (FacebookError e) {
            Log.w("facebook exception", e.toString());
        }
    } catch (MalformedURLException e) {
        Log.w("malformed exception", e.toString());
    } catch (IOException e) {
        Log.w("io exception", e.toString());
    }
}  

Спасибо, Амма

Ответ 1

Приведенный выше код абсолютно корректен... Проблема в том, что мы уже установили какое-либо приложение facebook на нашем устройстве, которые обновлены, чем мы используем наше приложение, не сработает... Если мы удалим приложения facebook в наше устройство будет работать... и есть еще один способ работать с нашим приложением и другим приложением facebook в нашем устройстве, выполнив следующие шаги: если u r использует eclipse, то goto

Windows > Предпочтения > Android > Построить и получить путь к хранилищу отладки

теперь откройте терминал и запустите следующую команду

keytool -export -alias androiddebugkey -keystore "путь отладки keystore" | openssl sha1 -binary | openssl enc -a -e

он попросит пароль, затем введите андроид как пароль ur  Теперь добавьте HASH KEY в вашу конфигурацию Facebook API, расположенную @http://www.facebook.com/developers/ на экране "ИЗОБРАЖЕНИЯ" / "Мобильный телефон" и "Устройства".

Теперь мне удалось запустить приложение на устройстве HTC

Ответ 2

Есть еще один ответ на этот вопрос. Мы можем предварительно установить приложение facebook на наше мобильное устройство, но мы не будем взаимодействовать с уже установленным приложением, т.е. мы не будем использовать единый вход, более известный как SSO (хотя рекомендуется использовать). У нас этот метод в facebook sdk. единый вход может быть отключен путем передачи FORCE_DIALOG_AUTH  как параметр activityCode в вашем вызове authorize().

public void authorize(Activity activity, String[] permissions,
        int activityCode, final DialogListener listener)

Здесь третий параметр играет роль, то есть activityCode.Now позволяет увидеть ее роль

 if (activityCode >= 0) {
        singleSignOnStarted = startSingleSignOn(activity, mAppId,
                permissions, activityCode);
    }
    // Otherwise fall back to traditional dialog.
    if (!singleSignOnStarted) {
        startDialogAuth(activity, permissions);
    }

Это означает, что если мы хотим быть нетронутыми с предварительно установленным приложением facebook, мы должны передать activityCode с менее чем 0 (< 0) value.Now в вашем основном действии, когда facebook api называется use

int FORCE_DIALOG_AUTH =-1;
mFacebook.authorize(this, new String[] { "publish_stream",
        "read_stream", "offline_access", "friends_birthday",
        "user_birthday", "email", "read_friendlists",
        "manage_friendlists" },FORCE_DIALOG_AUTH , new LoginDialogListener());

Если мы хотим заставить использовать наследие               на основе диалогов, запустите FORCE_DIALOG_AUTH для этого                параметр. В противном случае просто опустите этот параметр и Facebook                будет использовать подходящее значение по умолчанию. Это было просто для решения проблемы из SSO.

Ответ 3

вы можете сохранить токен доступа на sharedReference при входе в систему, следуя

public void onComplete(Bundle values) 
{
   SharedPreferences sp;
   Editor editor = sp.edit();
   editor.putString("access_token",fb.getAccessToken());
   editor.putLong("access_expires",fb.getAccessExpires());
   editor.commit();
}

и проверьте этот метод onCreate следующим образом

public void onCreate(Bundle savedInstanceState) 
{           
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_facebook_app);
        if(access_token != null){
            fb.setAccessToken(access_token);
        }
        if(expires != 0){
            fb.setAccessExpires(expires);
        }       
}