首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Facebook在android中多次返回运行应用程序的数据

Facebook在android中多次返回运行应用程序的数据
EN

Stack Overflow用户
提问于 2012-08-21 18:32:44
回答 1查看 159关注 0票数 0

当我第一次安装和运行应用程序时,我正在尝试检索我的facebook页面information.But。

代码语言:javascript
复制
{"error":{"message":"An active access token must be used to query information about the current user.","type":"OAuthException","code":2500}}

下一次我运行应用程序时,它会返回正确的result.Why。我希望它在安装后第一次运行应用程序时返回数据。

以下是我的facebook sdk代码:

代码语言:javascript
复制
private String access_Token="";
private final String APP_ID="MY_APP_ID";
private final String[] PERMS = new String[] { "publish_stream","manage_pages" };
private Bundle params=new Bundle();
private SharedPreferences sharedPrefs;
private AsyncFacebookRunner mAsyncRunner;
private Facebook mfacebook;
private TextView view;

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

    view=(TextView)findViewById(R.id.Mozi);

    this.SetConnection();                               //Initialize Fb
    this.getAccessToken();                              //GetAccessToken
    this.CheckSessionExpiry();                          //Create Session with permissions if expired
    this.RetrieveUserPages();
//  this.EnableFBLogout();
}

public void onResume() {
    super.onResume();
    mfacebook.extendAccessTokenIfNeeded(this, null);
}

private void EnableFBLogout()
{
    mAsyncRunner.logout(getApplicationContext(), new RequestListener() {
          @Override
          public void onComplete(String response, Object state) {

                 String method = "DELETE";
                 Bundle params = new Bundle();
                 /*
                  * this will revoke 'publish_stream' permission
                  * Note: If you don't specify a permission then this will de-authorize the application completely.
                  */
                 params.putString("permission", "publish_stream");
                 mAsyncRunner.request("/me/permissions", params, method,new RequestListener() {

                    @Override
                    public void onMalformedURLException(MalformedURLException e, Object state) {
                        // TODO Auto-generated method stub
                        Log.e("PerMalform",e.getMessage());
                    }

                    @Override
                    public void onIOException(IOException e, Object state) {
                        // TODO Auto-generated method stub
                        Log.e("PerMalform",e.getMessage());

                    }

                    @Override
                    public void onFileNotFoundException(FileNotFoundException e, Object state) {
                        // TODO Auto-generated method stub
                        Log.e("PerMalform",e.getMessage());

                    }

                    @Override
                    public void onFacebookError(FacebookError e, Object state) {
                        // TODO Auto-generated method stub
                        Log.e("PerMalform",e.getMessage());

                    }

                    @Override
                    public void onComplete(String response, Object state) {
                        // TODO Auto-generated method stub
                        Log.e("PerMalform",response);

                    }
                }, null);

          }

          @Override
          public void onIOException(IOException e, Object state) {}

          @Override
          public void onFileNotFoundException(FileNotFoundException e,
                Object state) {}

          @Override
          public void onMalformedURLException(MalformedURLException e,
                Object state) {}

          @Override
          public void onFacebookError(FacebookError e, Object state) {}
        });
}

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

    this.mfacebook.authorizeCallback(requestCode, resultCode, data);
}

private void getAccessToken()
{
    sharedPrefs= getPreferences(MODE_PRIVATE);
    String access_token = sharedPrefs.getString("access_token", null);
    long expires = sharedPrefs.getLong("access_expires", 0);
    if(access_token != null) {
        mfacebook.setAccessToken(access_token);
    }
    if(expires != 0) {
        mfacebook.setAccessExpires(expires);
    }
}

private void CheckSessionExpiry()
{
      if(!mfacebook.isSessionValid()) {

          mfacebook.authorize(this, this.PERMS , new DialogListener() {
              @Override
              public void onComplete(Bundle values) {
                  SharedPreferences.Editor editor = sharedPrefs.edit();
                  editor.putString("access_token", mfacebook.getAccessToken());
                  editor.putLong("access_expires", mfacebook.getAccessExpires());
                  editor.commit();
              }

              @Override
              public void onFacebookError(FacebookError error) {
                  Log.e("mozi1",error.toString());
              }

              @Override
              public void onError(DialogError e) {
                  Log.e("mozi2",e.toString());

              }

              @Override
              public void onCancel() { 

                  Log.e("sad","ww");
              }
          });
      }
  }

private void SetConnection()

{
    this.mfacebook=new Facebook(this.APP_ID);
    this.mAsyncRunner=new AsyncFacebookRunner(mfacebook);
}

private void  RetrieveUserPages()
{
    this.params.putString(Facebook.TOKEN, mfacebook.getAccessToken());
    this.mAsyncRunner.request("me/accounts", this.params, "GET", new RequestListener() {

        @Override
        public void onMalformedURLException(MalformedURLException e, Object state) {
            // TODO Auto-generated method stub
            Log.e("Malformed",e.getMessage());

        }

        @Override
        public void onIOException(IOException e, Object state) {
            // TODO Auto-generated method stub
            Log.e("IO",e.getMessage());

        }

        @Override
        public void onFileNotFoundException(FileNotFoundException e, Object state) {
            // TODO Auto-generated method stub
            Log.e("FNF",e.getMessage());

        }

        @Override
        public void onFacebookError(FacebookError e, Object state) {
            // TODO Auto-generated method stub
            Log.e("FBERR",e.getMessage());

        }

        @Override
        public void onComplete(String response, Object state) {
            // TODO Auto-generated method stub
            Log.i("responsefromFB",response);       //here the response is an error for the first time and data the second time.
        //  view.setText(response);                             
        }
    }, null);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-22 02:47:30

mfacebook.authorize()是异步的,这意味着即使authorize()没有完成,authorize()方法之后的代码也会运行。因为您在mfacebook.authorize()之后立即调用this.RetrieveUserPages(),所以您将调用

代码语言:javascript
复制
    this.params.putString(Facebook.TOKEN, mfacebook.getAccessToken());

mfacebook.authorize()完成之前,因此mfacebook.getAcessToken()返回null。

这个问题的答案是只在的onComplete方法中调用this.RetrieveUserPages(),以确保在尝试检索访问令牌之前设置了访问令牌。

如果有帮助,请让我知道!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12053030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档