Единый вход Facebook для Android не запускается OnComplete () - PullRequest
1 голос
/ 17 июня 2011

Я новичок как в 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();
        }
    }
}
...