如何使用FB FriendPickerFragment向您显示所有朋友的列表,以邀请他们使用您的应用

时间:2014-07-03 14:37:22

标签: android facebook facebook-graph-api onactivityresult facebook-friends

编辑-----:所以我设法让它向我展示用户并能够选择一些,并将选定的用户发送回我的应用程序,但是有一个小问题。 “Uri.parse(” 选择器://朋友 “);”不会给我我的朋友列表,但只列出我拥有的朋友列表并安装我的应用程序。

我按照这个例子:https://developers.facebook.com/docs/android/scrumptious/show-friends但我试图修改它,所以基本上我拿出了selectionActivity和Fragment。所以我在我的活动中有一个按钮,它调用包含FriendPickerFragment的PickerActivity。我可以从那里选择我的朋友,但回到我的活动onActivityResult我得到“数据”为null。

我的应用程序中有一个Application类,我保存了FB会话,并且还有登录功能。

在我的MainActivity onCreate中我有这个:

   MyApp.getInstance().facebookLogin(PSAddFriendsActivity.this, new CrudStateCallback() {
        @Override
        public void onResponse(final String string) {
            Log.i("", "session : session is opened? : " + MyApp.getInstance().fbSession.getAccessToken());               
        }
    });

登录后,我使用我在应用程序中的当前朋友实例化列表,此列表的第一个位置是FB按钮:

@Override
protected void onListItemClick(ListView l, View v, int position, long id){
    super.onListItemClick(l, v, position, id);
    if(position == 0){
            startPickerActivity(PSPickerActivity.FRIEND_PICKER, 0);
    }else if(position ==1){
        //TODO: OPEN CONTACTS PAGE TO ADD FRIENDS        
    }

}

这是我的onACtivityResult和这个类的“startPickerActivity”:

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
    Log.i("","--------------data is : " + data);
    Log.i("","--------------resultCode is : " + resultCode);
    Log.i("","--------------requestCode is : " + requestCode);

}

public void startPickerActivity(Uri data, int requestCode) {
    Intent intent = new Intent();
    intent.setData(data);
    intent.setClass(PSAddFriendsActivity.this, PickerActivity.class);
    startActivityForResult(intent, requestCode);
}

这是PickerActivity,我是如何从FB获取的:

public class PickerActivity extends FragmentActivity{
private FriendPickerFragment friendPickerFragment;
public static final Uri FRIEND_PICKER = Uri.parse("picker://friend");

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

    Bundle args = getIntent().getExtras();
    FragmentManager manager = getSupportFragmentManager();
    Fragment fragmentToShow = null;
    Uri intentUri = getIntent().getData();

    if (FRIEND_PICKER.equals(intentUri)) {
        if (savedInstanceState == null) {
            friendPickerFragment = new FriendPickerFragment(args);
        } else {
            friendPickerFragment =
                    (FriendPickerFragment) manager.findFragmentById(R.id.picker_fragment);
        }
        // Set the listener to handle errors
        friendPickerFragment.setOnErrorListener(new PickerFragment.OnErrorListener() {
            @Override
            public void onError(PickerFragment<?> fragment,
                                FacebookException error) {
                PSPickerActivity.this.onError(error);
            }
        });
        // Set the listener to handle button clicks
        friendPickerFragment.setOnDoneButtonClickedListener(
                new PickerFragment.OnDoneButtonClickedListener() {
                    @Override
                    public void onDoneButtonClicked(PickerFragment<?> fragment) {
                        finishActivity();
                    }
                });
        fragmentToShow = friendPickerFragment;

    } else {
        // Nothing to do, finish
        setResult(RESULT_CANCELED);
        finish();
        return;
    }

    manager.beginTransaction()
            .replace(R.id.picker_fragment, fragmentToShow)
            .commit();
}

private void onError(Exception error) {
    onError(error.getLocalizedMessage(), false);
}

private void onError(String error, final boolean finishActivity) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(R.string.error_dialog_title).
            setMessage(error).
            setPositiveButton(R.string.error_dialog_button_text,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            if (finishActivity) {
                                finishActivity();
                            }
                        }
                    });
    builder.show();
}

private void finishActivity() {
    setResult(RESULT_OK, null);
    finish();
}

@Override
protected void onStart() {
    super.onStart();
    if (FRIEND_PICKER.equals(getIntent().getData())) {
        try {
            friendPickerFragment.loadData(false);
        } catch (Exception ex) {
            onError(ex);
        }
    }
}

@Override
protected void onResume() {
    Log.i("", "location test onResume");
    super.onResume();
    MyApp.getInstance().pref.setIsBackground(this, false);
    MyApp.getInstance().startLocationClient();
}

@Override
protected void onPause() {
    Log.i("", "location test onPause");
    super.onPause();
    MyApp.getInstance().pref.setIsBackground(this, true);
}
}

现在我查看了这个片段,不知道我是否需要在“onDoneButtonClicked”上添加一些内容或从片段中保存一些东西?或究竟是什么,因为我的主要活动确实返回null作为数据..

1 个答案:

答案 0 :(得分:0)

忘了在finishActivty中调用它:

if (FRIEND_PICKER.equals(getIntent().getData())) {
        if (friendPickerFragment != null) {
            MyApp.getInstance().setSelectedUsers(friendPickerFragment.getSelection());
        }
    }

现在我可以从我的应用程序中获取所选用户的列表。

关于我的编辑,在此之后我发现使用Graph2.0你无法获得整个朋友列表的列表。您只能获取也喜欢该应用的朋友的信息。可以邀请朋友喜欢一个应用程序,但前提是你从FB开发者页面将其设置为游戏