我正在使用 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/