Android:成功登录后如何使用 firebase Auth 9.6.1 从 facebook 获取 token ?

标签 android facebook facebook-graph-api firebase firebase-authentication

我正在使用 Facebook 提供商使用 Firebase-UI 登录,我想知道如何从他们那里获取 token 。我到处搜索都没有成功,只找到 javascript 响应而不是 java.lang.这是代码:

  public class MainActivity extends AppCompatActivity {

    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private int[] tabIcons = {
            R.drawable.ic_rrr,
            R.drawable.compass,
            R.drawable.bell,
            R.drawable.cloud,
            R.drawable.user_circle,
    };
    SharedPreferences preferences;
    private Firebase myFirebaseRef = new Firebase("https://xxxxxxxxx/");
    private FirebaseAuth auth;
    private FirebaseUser firebaseUser;
    private FirebaseAuth.AuthStateListener mAuthListener;
    private User user;
    private static final int RC_SIGN_IN = 100;
    private static final int FLOCKIN_PROVIDER = 1;
    private static final int FACEBOOK_PROVIDER = 2;

    Geocoder geocoder;
    String bestProvider;
    double lat;
    double lng;
    List<Address> usr = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        auth = FirebaseAuth.getInstance();

        // Get the shared preferences
        preferences = getSharedPreferences("my_preferences", MODE_PRIVATE);
        Boolean user_saw_presentation = preferences.getBoolean("onboarding_complete", false);
        // Check if onboarding_complete is false
        if (!user_saw_presentation) {
            // Start the onboarding Activity
            Intent intro = new Intent(this, intro.class);
            startActivity(intro);
            finish();
            return;

        }

        /*firebaseUser= auth.getCurrentUser();

        if (firebaseUser != null) {
            // already signed in
            getUserDataFromProvider(firebaseUser);

        } else {
            // not signed in
            sendUserToAuthenticationScreen();
        }*/


        toolbar = (Toolbar) findViewById( R.id.toolbar );
        setSupportActionBar( toolbar );

        getSupportActionBar().setDisplayHomeAsUpEnabled( false );
        getSupportActionBar().setDisplayShowTitleEnabled( true );
        //getSupportActionBar().setLogo(R.mipmap.ic_launcher_toolbar);
        //getSupportActionBar().setDisplayUseLogoEnabled(true);

        viewPager = (ViewPager) findViewById( R.id.viewpager );
        setupViewPager( viewPager );


        tabLayout = (TabLayout) findViewById( R.id.tabs );
        tabLayout.setupWithViewPager( viewPager );
        tabLayout.setTabGravity( TabLayout.GRAVITY_FILL );
        setupTabIcons();

        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                    Log.d("Loggin state", "onAuthStateChanged:signed_in:" + user.getUid());
                    getUserDataFromProvider(user);
                } else {
                    // User is signed out
                    Log.d("Loggin state", "onAuthStateChanged:signed_out");
                    sendUserToAuthenticationScreen();

                }

            }
        };



    }

    @Override
    protected void onPostResume() {
        super.onPostResume();
        //just in case it doesn't work the disabling of the back button
//TODO:descomentar esto una vez que termine de probar
      /*  if (!preferences.getBoolean( "logged_in", false )) {
            sendUserToLogin();
        }*/
    }

    /*protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RC_SIGN_IN) {
            if (resultCode == RESULT_OK) {
                // user is signed in!
                Log.i("USER_AUTHENTICATION","LOGGED_IN");
                startActivity(new Intent(this, MainActivity.class));
                finish();
            } else {
                // user is not signed in. Maybe just wait for the user to press
                // "sign in" again, or show a message
                Log.i("USER_AUTHENTICATION","LOGIN_FAILED");
                sendUserToAuthenticationScreen();

            }
        }
    }*/


    //it gets the user data from Firebase
    private void getUserDataFromProvider(FirebaseUser firebaseUser){


        user=new User(
                firebaseUser.getUid(),
                firebaseUser.getDisplayName(),
                firebaseUser.getEmail(),
                firebaseUser.getPhotoUrl()
        );


        List<? extends UserInfo>  providers=firebaseUser.getProviderData();
        //which type of user,if thesecondelement comes
        String provider= providers.get(1).getProviderId();
        if(provider.equals("facebook.com")){
            user.setProvider(FACEBOOK_PROVIDER);
        }else if(provider.equals("password")){
            user.setProvider(FLOCKIN_PROVIDER);
        }
    }





    private void sendUserToAuthenticationScreen() {


        startActivityForResult(
                AuthUI.getInstance().createSignInIntentBuilder().setProviders(
                        AuthUI.EMAIL_PROVIDER,
                        AuthUI.FACEBOOK_PROVIDER)
                        //.setTheme(R.style.SuperAppTheme)
                        .build(),
                RC_SIGN_IN);


    }

    private void setupTabIcons() {
        tabLayout.getTabAt( 0 ).setIcon( tabIcons[0] );
        tabLayout.getTabAt( 1 ).setIcon( tabIcons[1] );
        tabLayout.getTabAt( 2 ).setIcon( tabIcons[2] );
        tabLayout.getTabAt( 3 ).setIcon( tabIcons[3] );
        tabLayout.getTabAt( 4 ).setIcon( tabIcons[4] );

        tabLayout.getTabAt( 0 ).getIcon().setColorFilter( Color.WHITE, PorterDuff.Mode.SRC_IN );
        tabLayout.getTabAt( 1 ).getIcon().setColorFilter( Color.parseColor( "#1976D2" ), PorterDuff.Mode.SRC_IN );
        tabLayout.getTabAt( 2 ).getIcon().setColorFilter( Color.parseColor( "#1976D2" ), PorterDuff.Mode.SRC_IN );
        tabLayout.getTabAt( 3 ).getIcon().setColorFilter( Color.parseColor( "#1976D2" ), PorterDuff.Mode.SRC_IN );
        tabLayout.getTabAt( 4 ).getIcon().setColorFilter( Color.parseColor( "#1976D2" ), PorterDuff.Mode.SRC_IN );


        tabLayout.setOnTabSelectedListener( new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                tab.getIcon().setColorFilter( Color.WHITE, PorterDuff.Mode.SRC_IN );

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                tab.getIcon().setColorFilter( Color.parseColor( "#1976D2" ), PorterDuff.Mode.SRC_IN );
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        } );
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate( R.menu.menu_home, menu );
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id) {
            case R.id.logout:
              //logout logic
        }
        return true;
    }



    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new MainMyFloks(), "Floks");
        adapter.addFragment(new MainNearby(), "Explore");
        adapter.addFragment(new MainAlerts(), "Alerts");
        adapter.addFragment(new MainArchive(), "Archive");
        adapter.addFragment(new MainProfile(), "Profile");
        viewPager.setAdapter(adapter);
        viewPager.setOffscreenPageLimit(5);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            //return mFragmentTitleList.get(position);
            return null;

        }
    }

    @Override
    public void onStart() {
        super.onStart();
        auth.addAuthStateListener(mAuthListener);
    }

    @Override
    public void onStop() {
        super.onStop();
        if (mAuthListener != null) {
            auth.removeAuthStateListener(mAuthListener);
        }
    }
}

并且我记录了有关此方法的信息,并在登录后正确访问了我的应用:

private void getUserDataFromProvider(FirebaseUser firebaseUser){


    user=new User(
            firebaseUser.getUid(),
            firebaseUser.getDisplayName(),
            firebaseUser.getEmail(),
            firebaseUser.getPhotoUrl()
    );

    Log.i("FIREBASE_ID",user.getFirebaseId());


    List<? extends UserInfo>  providers=firebaseUser.getProviderData();
    //which type of user,if thesecondelement comes
    String provider= providers.get(1).getProviderId();
    if(provider.equals("facebook.com")){
        user.setProvider(FACEBOOK_PROVIDER);
    }else if(provider.equals("password")){
        user.setProvider(FLOCKIN_PROVIDER);
    }
}

有什么想法吗?非常感谢

最佳答案

从 firebase 获取 facebook accessToken 非常简单。我正在使用 firebase 身份验证用户界面。使用 facebook 进行身份验证后,您将从 firebase 用户对象获取基本信息,如显示名称、电子邮件、提供商详细信息。但如果你想要更多信息,比如性别,生日 facebook Graph API 是解决方案。一旦用户通过 Facebook 进行身份验证,您就可以获得这样的访问 token 。

AccessToken.getCurrentAccessToken()

但有时它会给你 NULL 值而不是有效的访问 token 。请确保您在此之前已经初始化了 facebook SDK。

    public class MyApplication extends Application {
      @Override
      public void onCreate() {
         super.onCreate();
         FacebookSdk.sdkInitialize(this);
      }
   }

初始化后使用graphAPI

    if(AccessToken.getCurrentAccessToken()!=null) {

        System.out.println(AccessToken.getCurrentAccessToken().getToken());

        GraphRequest request = GraphRequest.newMeRequest(
                AccessToken.getCurrentAccessToken(),
                new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(JSONObject object, GraphResponse response) {
                        // Application code
                        try {
                            String email = object.getString("email");
                            String gender = object.getString("gender");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });
        Bundle parameters = new Bundle();
        parameters.putString("fields", "id,name,email,gender,birthday");
        request.setParameters(parameters);
        request.executeAsync();

    }
    else
    {
        System.out.println("Access Token NULL");
    }

快乐编码:)

关于Android:成功登录后如何使用 firebase Auth 9.6.1 从 facebook 获取 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40052702/

相关文章:

javascript - react ( Facebook ): managed state of controlled checkboxes

javascript - 来自 Facebook 应用程序的混淆 Javascript 代码?

facebook - 如何通过 GRAPH API 获取 Facebook 照片隐私设置

javascript - 在手机上使用 Facebook URL 方案向 Facebook 发布消息

android - 当我尝试向其添加图像按钮时,我的应用程序崩溃了

android - 如何添加没有日期对象而不是日历对象

facebook - QML 有什么方法可以使用 Facebook Javascript SDK 加载数据吗?

Android SMSManager 一般故障

facebook - 如何在用户墙上发布图库图像

来 self 的应用程序的 Facebook 通知出现和消失