2

私はFacebookベースのプロバイダを使用してFirebase-UIを使ってログインしています。トークンを取得する方法を知りたいと思います。私はどんな成功もせずにどこでも検索し、ジャバスクリプトレスポンスしか見つけず、javaではありませんでした。これはコードです:Android:ログイン後にfirebase Auth 9.6.1を使用してFacebookにトークンを取得するにはどうすればよいですか?

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); 
    } 
} 

任意のアイデア?。ありがとうございます

答えて

5

firebaseからfacebook accessTokenを取得することは非常に簡単です。 firebase auth UIを使用していました。 facebookで認証した後、表示名、電子メール、プロバイダの詳細などfirebaseユーザオブジェクトから基本情報を取得します。しかし、あなたが性別のようなより多くの情報を望むならば、誕生日のfacebook Graph APIが解決策です。ユーザーがFacebookで認証されると、このようなアクセストークンを得ることができます。

AccessToken.getCurrentAccessToken() 

ただし、有効なアクセストークンではなくNULL値が返されることがあります。その前にfacebook SDKを初期化しておいてください。

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

-1

Firebase認証が成功すると、デバイスのトークンが生成され、にonTokenRefresh()コールバックが配信されます。

これはGoogleのFirebase Guideのサンプルです。詳細についてはthis linkをチェックしてください。

import com.google.firebase.iid.FirebaseInstanceId; 
import com.google.firebase.iid.FirebaseInstanceIdService; 


public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { 

    private static final String TAG = "MyFirebaseIIDService"; 

    /** 
    * Called if InstanceID token is updated. This may occur if the security of 
    * the previous token had been compromised. Note that this is called when the InstanceID token 
    * is initially generated so this is where you would retrieve the token. 
    */ 
    // [START refresh_token] 
    @Override 
    public void onTokenRefresh() { 
     // Get updated InstanceID token. 
     String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
     Log.d(TAG, "Refreshed token: " + refreshedToken); 

     // If you want to send messages to this application instance or 
     // manage this apps subscriptions on the server side, send the 
     // Instance ID token to your app server. 
     sendRegistrationToServer(refreshedToken); 
    } 
    // [END refresh_token] 

    /** 
    * Persist token to third-party servers. 
    * 
    * Modify this method to associate the user's FCM InstanceID token with any server-side account 
    * maintained by your application. 
    * 
    * @param token The new token. 
    */ 
    private void sendRegistrationToServer(String token) { 
     // TODO: Implement this method to send token to your app server. 
    } 
} 
+0

:)ありがとうコーディング

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"); } 

ハッピー初期利用graphAPI後、驚異を働きました。 AndroidManifest XMLにインテントフィルタを追加することは言及していませんでした。トークンをデータベースに保存するのか、それとも共有の環境設定に保存するのですか?.....これがファイヤーベースのトークンか、私たちが話しているfacebookトークンなのですか? FCMセクション.....フェイスブックトークンを返すことは一度も言及していません – Juan

+2

あなたは間違いをしたと思います。これはFCMのトークンです...私はちょうどfirebaseからのfacebookのアクセストークンを取得したいと思います.... – Juan

+0

私はあなたがFCMトークンを意味すると思ったことをお詫び申し上げます。私はそれを試していないが、これは(https://github.com/firebase/FirebaseUI-Android/blob/9fb5779c6037567228becdc24bc82466296b4eb0/auth/src/main/java/com/firebase/ui/auth/provider/FacebookProvider。 java)はFirebaseの例で、チェックアウトしたいかもしれません。 – MohanadMohie

1

私はトークンのFacebookのアクセスとまだ私は、彼らが作業している見てきたものから(任意のトークンを返しませんfirebaseUIと、ログイン後にこのコードを使用して、現在のユーザーのFacebookのIDを取得することができあなた自身を認証するのに使用したプロバイダの関連トークンを返します).....

CallbackManager callbackManager = CallbackManager.Factory.create();

 if (AccessToken.getCurrentAccessToken() == null) { 
      Log.i("not_logged","0"); 
     } else { 
      Log.d("FACEBOOK_ACCESS_TOKEN",AccessToken.getCurrentAccessToken().getToken().toString()); 
      //save the token in shared preferences 
      editor.putString("FACEBOOK_TOKEN",AccessToken.getCurrentAccessToken().getToken().toString()); 
      String facebook_ID=Profile.getCurrentProfile().getId().toString(); 
      Log.d("FACEBOOK_ID",facebook_ID); 
      editor.putString("FACEBOOK_ID",facebook_ID); 
      editor.commit(); 
     } 

    } 
関連する問題