无法在真实设备上检索Facebook的访问令牌

时间:2011-05-07 05:14:55

标签: android 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());
    }
}  

谢谢, Ammu

3 个答案:

答案 0 :(得分:11)

上面给出的代码是绝对正确的...问题是如果我们已经在我们的设备中安装了任何升级版本的facebook应用程序,那么我们使用我们的应用程序将无法正常运行...如果我们卸载了facebook应用程序我们的设备可以工作...还有另一种方法可以通过以下步骤在我们的设备中处理我们的应用程序和其他Facebook应用程序::: 如果你使用eclipse然后转到

Windows&gt;偏好设置&gt; Android&gt;构建并获取调试密钥库的路径

现在打开终端并运行以下命令

keytool -export -alias androiddebugkey -keystore“debug keystore path”| openssl sha1 -binary | openssl enc -a -e

它会询问密码然后输入android作为你的密码  现在将HASH KEY添加到位于@ http://www.facebook.com/developers/的Facebook API配置中 在EDIT SETTINGS / Mobile and Devices屏幕下。

现在我能够在HTC设备上运行我的应用程序

答案 1 :(得分:2)

这个问题有另一个答案。 我们可以预先安装Facebook应用程序到我们的移动设备,但我们不会与已安装的应用程序进行交互,即。我们不会使用单点登录,更好地称为SSO(尽管建议使用)。 我们在facebook sdk中使用此方法。 可以通过传递FORCE_DIALOG_AUTH来禁用单点登录  作为authorize()的调用中的activityCode参数。

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应用程序不受影响,我们必须传递少于0(<0)值的activityCode。现在在你的主要活动中调用facebook api

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的问题。

答案 2 :(得分:1)

登录时可以在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();
}

并在“创建方法”中选中此项

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