安卓 Facebook 登录

标签 android facebook

我有一个 Android 应用程序,我必须通过它登录 Facebook。 我正在使用 facebook sdk 的 session 对象来登录。 但是,如果设备中安装了实际的 Facebook 应用程序,则无法登录。

下面是我的代码

public class FacebookSettings extends FragmentActivity{
/** Called when the activity is first created. */

private static final int LOGIN = 0;
private static final int LOGGED_IN = 1;
private static final int FRAGMENT_COUNT = LOGGED_IN +1;
private Button publishButton;
private Fragment[] fragments = new Fragment[FRAGMENT_COUNT];
private Session mSession;

private boolean isResumed = false;


@Override
public void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    uiHelper.onPause();
    isResumed=false;
}


@Override
public void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    uiHelper.onResume();
    isResumed=true;
}


protected static final String LOG_TAG = "FACEBOOK_TEST";


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    setContentView(R.layout.fb_settings);
    publishButton=(Button) findViewById(R.id.publishButton);
    android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
    fragments[LOGIN] = fm.findFragmentById(R.id.Login_Fragment);
    fragments[LOGGED_IN] = fm.findFragmentById(R.id.Logged_in_Fragment);

    android.support.v4.app.FragmentTransaction transaction = fm.beginTransaction();
    for(int i = 0; i < fragments.length; i++) {
        transaction.hide(fragments[i]);
    }
    transaction.commit();

    uiHelper = new UiLifecycleHelper(this, callBack);
    uiHelper.onCreate(savedInstanceState);


}

private void showFragment(int fragmentIndex, boolean addToBackStack) {
    android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction transaction = fm.beginTransaction();
    for (int i = 0; i < fragments.length; i++) {
        if (i == fragmentIndex) {
            transaction.show(fragments[i]);
        } else {
            transaction.hide(fragments[i]);
        }
    }
    if (addToBackStack) {
        transaction.addToBackStack(null);
    }
    transaction.commit();
}

private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    // Only make changes if the activity is visible
    if (isResumed) {
        Log.d("facebook","isResumed \n\n\n\n"+state.name());

        android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
        // Get the number of entries in the back stack
        int backStackSize = manager.getBackStackEntryCount();
        // Clear the back stack
        for (int i = 0; i < backStackSize; i++) {
            manager.popBackStack();
        }
        if (state.isOpened()) {
            Log.d("facebook","State isOpened in on session state changed");
            // If the session state is open:
            // Show the authenticated fragment
            publishButton.setVisibility(View.VISIBLE);
            showFragment(LOGGED_IN, false);
        } else if (state.isClosed()) {
            Log.d("facebook","State isClosed in on session state changed");
            // If the session state is closed:
            // Show the login fragment
            publishButton.setVisibility(View.INVISIBLE);
            showFragment(LOGIN, false);
        }
    }
}

@Override
protected void onResumeFragments() {
    // TODO Auto-generated method stub
    super.onResumeFragments();
    Session session = Session.getActiveSession();

    if (session != null && session.isOpened()) {
        // if the session is already open,
        // try to show the selection fragment
        Log.d("facebook","State isOpened in resume fragments\n\n\n");
        publishButton.setVisibility(View.VISIBLE);
        showFragment(LOGGED_IN, false);
    } else {
        // otherwise present the splash screen
        // and ask the user to login.
        Log.d("facebook","State isClosed in resume fragments\n\n\n");
        publishButton.setVisibility(View.INVISIBLE);

        showFragment(LOGIN, false);
    }
}

private UiLifecycleHelper uiHelper;


private Session.StatusCallback callBack=new StatusCallback() {

    @Override
    public void call(Session session, SessionState state, Exception exception) {
        // TODO Auto-generated method stub
        Log.d("facebook","in status call back \n\n\n\n");
        Log.d("facebook","state\n\n\n\n"+session.isClosed());
        Log.d("facebook","state\n\n\n\n"+session.isOpened());
        Log.d("facebook","state\n\n\n\n"+state.isClosed());
        Log.d("facebook","state\n\n\n\n"+state.isOpened());
        onSessionStateChange(session,state,exception);
    }
};


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

@Override
public void onDestroy() {
    super.onDestroy();
    uiHelper.onDestroy();
}


@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    uiHelper.onSaveInstanceState(outState);
}


}

请帮忙 谢谢

最佳答案

我认为您正在寻找这个:

    <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/applicationId" />

Facebook sdk 使用此元数据将 session 附加到您的应用程序。 您还可以在使用构建器创建 session 时设置它

       new Session.Builder(this).setApplicationId(Constants.Facebook.APP_ID)

引用HelloFacebookSample中的AndroidManifest.xml

关于安卓 Facebook 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14748908/

相关文章:

java - 在给定文件名的图库应用程序中显示照片

iOS Facebook token 权限生日

Facebook App 与 Facebook Connect 网站

java - TextView 在相对布局中不显示全文

android - java.lang.RuntimeException : Parcelable encountered IOException writing serializable object 错误

java - 使用 ETag 但状态代码始终为 200 而不是 304

ios - 如何为 native iOS 应用程序创建测试用户?

facebook - 如何配置 Facebook webhooks?

android - 使用 Toolbar.OnClickListener 而不是 ActionBar.TabListener?

java - 除非 GPS 开启,否则融合位置提供程序无法获取位置