Я новичок как в Android, так и в Facebook, сейчас занимаюсь изучением учебных пособий и написал простое приложение для поиска друзей пользователя и отображения его профилей в GridView. Когда я запускаю свою программу, используя только диалог WebView для авторизации пользователей, все работает отлично. Однако, когда приложение Facebook установлено и пользователь уже вошел в систему, метод authorize использует Single-Sign-On, а метод OnComplete () прослушивателя диалога, который был передан, никогда не вызывается. Поскольку метод authorize является асинхронным, я не думаю, что смогу просто поместить код после метода authorize. Как мне исправить это? AuthListener какой-то? Я уверен, что есть простое решение, но документация Facebook довольно скудна, и в примерах используются гораздо более сложные методы авторизации пользователей и хранения их информации. Вот код для основного класса деятельности:
package com.jackson;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.widget.GridView;
import com.facebook.android.DialogError;
import com.facebook.android.Facebook;
import com.facebook.android.Facebook.DialogListener;
import com.facebook.android.FacebookError;
/**
* DESPERATELY needs Facebook batch requests.
*/
public class GridViewFbFriends extends Activity {
private static final String APP_ID = "121897711227945";
private static final int FRIEND_LIMIT = 25;
private Facebook mFacebook;
private Drawable[] mFriendImages;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mFacebook = new Facebook(APP_ID);
mFacebook.authorize(this, new DialogListener() {
@Override
public void onComplete(Bundle values) {
getFriendImages();
setUpUI();
}
@Override
public void onFacebookError(FacebookError error) {}
@Override
public void onError(DialogError e) {}
@Override
public void onCancel() {}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mFacebook.authorizeCallback(requestCode, resultCode, data);
}
private void setUpUI(){
//set up the image adapter
ImageAdapter imageAdapter = new ImageAdapter(this);
imageAdapter.setDrawableImages(mFriendImages);
//set up the gridview
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(imageAdapter);
}
private void getFriendImages(){
//get the user's list of friends
String[] friendIDs = null;
try{
JSONObject json = new JSONObject(mFacebook.request("me/friends"));
JSONArray jsonArray = new JSONArray(json.getString("data"));
if(FRIEND_LIMIT < jsonArray.length()) friendIDs = new String[FRIEND_LIMIT];
else friendIDs = new String[jsonArray.length()];
for(int i=0; i < friendIDs.length; i++)
friendIDs[i] = jsonArray.getJSONObject(i).getString("id");
}
catch(JSONException e){
Log.d("JSON Error: ", e.getMessage());
e.printStackTrace();
}
catch(IOException e){
Log.d("Error getting friends: ", e.getMessage());
e.printStackTrace();
}
catch (NullPointerException e) {
Log.d("Friend IDs Null: ", e.getMessage());
e.printStackTrace();
}
//get each friend's picture
try {
mFriendImages = new Drawable[friendIDs.length];
for(int i=0; i<mFriendImages.length; i++){
URL url = new URL("http://graph.facebook.com/"+friendIDs[i]+"/picture");
mFriendImages[i] = Drawable.createFromStream(url.openStream(), null);
}
} catch (MalformedURLException e) {
Log.d("Error getting friends: ", e.getMessage());
e.printStackTrace();
} catch (IOException e) {
Log.d("Error getting friends: ", e.getMessage());
e.printStackTrace();
}
catch (NullPointerException e) {
Log.d("Friend IDs null: ", e.getMessage());
e.printStackTrace();
}
}
}