Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:成功登录后,如何使用firebase Auth 9.6.1从facebook获取令牌?_Android_Facebook_Facebook Graph Api_Firebase_Firebase Authentication - Fatal编程技术网

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

Android:成功登录后,如何使用firebase Auth 9.6.1从facebook获取令牌?,android,facebook,facebook-graph-api,firebase,firebase-authentication,Android,Facebook,Facebook Graph Api,Firebase,Firebase Authentication,我正在使用FacebookProvider登录Firebase用户界面,我想知道如何从他们那里获得令牌。我到处搜索都没有成功,只找到javascript响应,没有找到java。代码如下: public class MainActivity extends AppCompatActivity { private Toolbar toolbar; private TabLayout tabLayout; private ViewPager viewPager;

我正在使用FacebookProvider登录Firebase用户界面,我想知道如何从他们那里获得令牌。我到处搜索都没有成功,只找到javascript响应,没有找到java。代码如下:

  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);
        }
    }
}
public类MainActivity扩展了AppCompatActivity{
专用工具栏;
私人摊位摊位;
私人视页机视页机;
私有int[]选项卡图标={
R.drawable.ic\rrr,
罗盘,
R.drawable.bell,
R.drawable.cloud,
R.drawable.user\u圆,
};
共享参考偏好;
私有Firebase myFirebaseRef=新Firebase(“https://xxxxxxxxx/");
私有FirebaseAuth-auth;
私有FirebaseUser FirebaseUser;
私有FirebaseAuth.AuthStateListener mAuthListener;
私人用户;
专用静态最终整数RC_SIGN_IN=100;
私有静态最终int FLOCKIN_PROVIDER=1;
私有静态最终int FACEBOOK_提供程序=2;
地理编码器;
字符串提供程序;
双lat;
双液化天然气;
列表usr=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
auth=FirebaseAuth.getInstance();
//获取共享的首选项
首选项=getSharedPreferences(“我的首选项”,模式为私有);
Boolean user_saw_presentation=preferences.getBoolean(“onboarding_complete”,false);
//检查入职检查是否为假
如果(!用户看到演示文稿){
//开始入职活动
Intent intro=新Intent(这是intro.class);
星触觉(简介);
完成();
返回;
}
/*firebaseUser=auth.getCurrentUser();
if(firebaseUser!=null){
//已登录
getUserDataFromProvider(firebaseUser);
}否则{
//未登录
sendUserToAuthenticationScreen();
}*/
toolbar=(toolbar)findviewbyd(R.id.toolbar);
设置支持操作栏(工具栏);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setDisplayShowTitleEnabled(true);
//getSupportActionBar().setLogo(R.mipmap.ic_启动器_工具栏);
//getSupportActionBar().setDisplayUseLogoEnabled(true);
viewPager=(viewPager)findViewById(R.id.viewPager);
设置viewPager(viewPager);
tabLayout=(tabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
tabLayout.setTabGravity(tabLayout.GRAVITY\u-FILL);
setupTabIcons();
mAuthListener=new FirebaseAuth.AuthStateListener(){
@凌驾
AuthStateChanged上的公共void(@NonNull FirebaseAuth FirebaseAuth){
FirebaseUser=firebaseAuth.getCurrentUser();
如果(用户!=null){
//用户已登录
Log.d(“Loggin状态”、“onAuthStateChanged:signed_in:”+user.getUid());
getUserDataFromProvider(用户);
}否则{
//用户已注销
Log.d(“Loggin状态”、“onAuthStateChanged:已签署”);
sendUserToAuthenticationScreen();
}
}
};
}
@凌驾
PostResume()上的受保护无效{
super.onPostResume();
//以防禁用“后退”按钮后无法工作
//待办事项:请说明您的身份
/*if(!preferences.getBoolean(“登录”,false)){
sendUserToLogin();
}*/
}
/*受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==RC\u登录){
if(resultCode==RESULT\u OK){
//用户已登录!
Log.i(“用户验证”、“登录”);
startActivity(新意图(this,MainActivity.class));
完成();
}否则{
//用户未登录。可能只是等待用户按
//再次“登录”,或显示消息
Log.i(“用户验证”、“登录失败”);
sendUserToAuthenticationScreen();
}
}
}*/
//它从Firebase获取用户数据
私有void getUserDataFromProvider(FirebaseUser FirebaseUser){
用户=新用户(
firebaseUser.getUid(),
firebaseUser.getDisplayName(),
firebaseUser.getEmail(),
firebaseUser.getPhotoUrl()
);

列表Firebase身份验证成功后,将生成设备的令牌,并将
onTokenRefresh()
回调传递给
FirebaseMessagingService

这是谷歌Firebase指南中的一个示例。查看更多信息

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.
    }
}

我可以在使用firebaseUI登录后使用此代码获取当前用户的facebook访问令牌和facebook id,但firebaseUI仍然不返回任何令牌(据我所知,他们正在返回您用于验证自己的提供商的相关令牌)

CallbackManager CallbackManager=CallbackManager.Factory.create()


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

AccessToken.getCurrentAccessToken()
但有时它会给你空值,而不是有效的访问令牌
        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();
        }

    }
AccessToken.getCurrentAccessToken()
    public class MyApplication extends Application {
      @Override
      public void onCreate() {
         super.onCreate();
         FacebookSdk.sdkInitialize(this);
      }
   }
    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");
    }