2

我正在编写应用程序,它将在 facebook 中读取我朋友的状态更新。即使我拥有完整的权限列表,我也有这个“必须使用活动访问令牌来查询有关当前用户的信息”错误。我现在不知道该怎么办。谢谢!

 package com.facebook.androidhive;

 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.util.ArrayList;
 import java.util.HashMap;

 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;

 import android.app.Activity;
 import android.app.ListActivity;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
 import android.widget.Button;
 import android.widget.ListAdapter;
 import android.widget.SimpleAdapter;
  import android.widget.TextView;
 import android.widget.Toast;

 import com.facebook.HttpMethod;
 import com.facebook.Request;
 import com.facebook.Response;
 import com.facebook.Session;
  import com.facebook.android.AsyncFacebookRunner;
   import com.facebook.android.AsyncFacebookRunner.RequestListener;
 import com.facebook.android.DialogError;
  import com.facebook.android.Facebook;
  import com.facebook.android.Facebook.DialogListener;
       import com.facebook.android.FacebookError;
import com.facebook.model.GraphObject;

       public class AndroidFacebookConnectActivity extends ListActivity{
JSONArray contacts = null;
// APP ID
          private static String APP_ID = "225620300920985"; 
          private String access_token;
        // Instance of Facebook Class
                @SuppressWarnings("deprecation")
        private Facebook facebook = new Facebook(APP_ID);
        @SuppressWarnings("deprecation")
          private AsyncFacebookRunner mAsyncRunner;
      String FILENAME = "AndroidSSO_data";
     private SharedPreferences mPrefs;

// Buttons


Button btnFbLogin;
Button btnFbGetProfile;
Button btnPostToWall;
Button btnShowAccessTokens;

private static final String TAG_CONTACTS = "contacts";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_EMAIL = "email";
private static final String TAG_ADDRESS = "address";
private static final String TAG_GENDER = "gender";
private static final String TAG_PHONE = "phone";
private static final String TAG_PHONE_MOBILE = "mobile";
private static final String TAG_PHONE_HOME = "home";
private static final String TAG_PHONE_OFFICE = "office";

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

    btnFbLogin = (Button) findViewById(R.id.btn_fblogin);
    btnFbGetProfile = (Button) findViewById(R.id.btn_get_profile);
    btnPostToWall = (Button) findViewById(R.id.btn_fb_post_to_wall);
    btnShowAccessTokens = (Button) findViewById(R.id.btn_show_access_tokens);
    mAsyncRunner = new AsyncFacebookRunner(facebook);

    /**
     * Login button Click event
     * */
    btnFbLogin.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Log.d("Image Button", "button Clicked");
            loginToFacebook();
        }
    });
    /**
     * Getting facebook Profile info
     * */
    btnFbGetProfile.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            getProfileInformation();
        }
    });

    /**
     * Posting to Facebook Wall
     * */
    btnPostToWall.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            postToWall();
        }
    });

    /**
     * Showing Access Tokens
     * */
    btnShowAccessTokens.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            showAccessTokens();
        }
    });

}

/**
 * Function to login into facebook
 * */
@SuppressWarnings("deprecation")
public void loginToFacebook() {

    mPrefs = getPreferences(MODE_PRIVATE);
    String access_token = mPrefs.getString("access_token", null);
    long expires = mPrefs.getLong("access_expires", 0);

    if (access_token != null) {
        facebook.setAccessToken(access_token);

        btnFbLogin.setVisibility(View.INVISIBLE);

        // Making get profile button visible
        btnFbGetProfile.setVisibility(View.VISIBLE);

        // Making post to wall visible
        btnPostToWall.setVisibility(View.VISIBLE);

        // Making show access tokens button visible
        btnShowAccessTokens.setVisibility(View.VISIBLE);

        Log.d("FB Sessions", "" + facebook.isSessionValid());
    }

    if (expires != 0) {
        facebook.setAccessExpires(expires);
    }

    if (!facebook.isSessionValid()) {
        facebook.authorize(this,
                new String[] {  "user_about_me","user_activities","user_birthday","user_checkins","user_education_history","user_events","user_groups","user_hometown","user_interests","user_likes","user_location","user_notes","user_online_presence","user_photo_video_tags","user_photos","user_relationships","user_relationship_details","user_religion_politics","user_status","user_videos","user_website","user_work_history","email","read_friendlists","read_insights","read_mailbox","read_requests","read_stream","xmpp_login","ads_management","create_event","manage_friendlists","manage_notifications","offline_access","publish_checkins","publish_stream","rsvp_event","sms","publish_actions","manage_pages" },
                new DialogListener() {

                    @Override
                    public void onCancel() {
                        // Function to handle cancel event
                    }

                    @Override
                    public void onComplete(Bundle values) {
                        // Function to handle complete event
                        // Edit Preferences and update facebook acess_token
                        SharedPreferences.Editor editor = mPrefs.edit();
                        editor.putString("access_token",
                                facebook.getAccessToken());
                        editor.putLong("access_expires",
                                facebook.getAccessExpires());
                        editor.commit();

                        // Making Login button invisible
                        btnFbLogin.setVisibility(View.INVISIBLE);

                        // Making logout Button visible
                        btnFbGetProfile.setVisibility(View.VISIBLE);

                        // Making post to wall visible
                        btnPostToWall.setVisibility(View.VISIBLE);

                        // Making show access tokens button visible
                        btnShowAccessTokens.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onError(DialogError error) {
                        // Function to handle error

                    }

                    @Override
                    public void onFacebookError(FacebookError fberror) {
                        // Function to handle Facebook errors

                    }

                });
    }
}

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


/**
 * Get Profile information by making request to Facebook Graph API
 * */
@SuppressWarnings("deprecation")
public void getProfileInformation() {


    String fqlQuery = "SELECT status_id, uid , message FROM status WHERE uid         IN        (SELECT uid2 FROM friend WHERE uid1 = me())";
      Bundle params = new Bundle();
      params.putString("q", fqlQuery);
      Session session = Session.getActiveSession();



    Request request = new Request(session,
              "/fql",                         
              params,                         
              HttpMethod.GET,                 
              new Request.Callback(){  

        @SuppressWarnings("deprecation")
        public void onCompleted(Response response) {

                GraphObject graphObject = response.getGraphObject();
                System.out.println(response);

                if (graphObject != null)
                {
                    if (graphObject.getProperty("data") != null)
                    {
                        try {
                            String arry = graphObject.getProperty("data").toString();

                            JSONArray jsonNArray = new JSONArray(arry);

                            for (int i = 0; i < jsonNArray.length(); i++) {

                                JSONObject jsonObject = jsonNArray.getJSONObject(i);

                                String name = jsonObject.getString("name");
                                String uid = jsonObject.getString("uid");

                                String pic_square = jsonObject.getString("pic_square");
                                String status = jsonObject.getString("status");

                                Log.i("Entry", "uid: " + uid + ", name: " + name + ", pic_square: " + pic_square + ", status: " + status);
                            }

                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }                                       
                    }
                }

        }                  
}); 
Request.executeBatchAsync(request);                 
}


/**
 * Function to post to facebook wall
 * */
public void postToWall() {
    // post on user's wall.
    facebook.dialog(this, "feed", new DialogListener() {

        @Override
        public void onFacebookError(FacebookError e) {
        }

        @Override
        public void onError(DialogError e) {
        }

        @Override
        public void onComplete(Bundle values) {
        }

        @Override
        public void onCancel() {
        }
    });

}

/**
 * Function to show Access Tokens
 * */
public void showAccessTokens() {
    access_token = facebook.getAccessToken();

    Toast.makeText(getApplicationContext(),
            "Access Token: " + access_token, Toast.LENGTH_LONG).show();
}

/**
 * Function to Logout user from Facebook
 * */

public void logoutFromFacebook() {
    mAsyncRunner.logout(this, new RequestListener() {
        @Override
        public void onComplete(String response, Object state) {
            Log.d("Logout from Facebook", response);
            if (Boolean.parseBoolean(response) == true) {
                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        // make Login button visible
                        btnFbLogin.setVisibility(View.VISIBLE);

                        // making all remaining buttons invisible
                        btnFbGetProfile.setVisibility(View.INVISIBLE);
                        btnPostToWall.setVisibility(View.INVISIBLE);
                              btnShowAccessTokens.setVisibility(View.INVISIBLE);
                    }

                });

            }
        }

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

我在 System.out.println(response); 上遇到的错误:

{"error":{"type":"OAuthException","message":"An active access token must be used to query information about the current user.","code":2500}} 

固定:只需在参数中包含访问令牌:

      String fqlQuery = "SELECT status_id, uid , message FROM status WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())";
      Bundle params = new Bundle();
      params.putString("q", fqlQuery);
      params.putString("access_token", facebook.getAccessToken());
      Session session = Session.getActiveSession();



    Request request = new Request(session,
              "/fql",                         
              params,                         
              HttpMethod.GET,                 
4

1 回答 1

1

Tried by getting acesstoken but problem is Session in not valid in this activity,so restore session in your activity or activate new session to complete this task.

于 2014-01-23T10:36:40.807 回答