将facebook id和电子邮件保存到本地数据库

时间:2015-12-29 05:49:53

标签: android facebook android-sqlite

我开始通过Facebook了解用户登录信息。在我的代码中有一个带FB登录按钮的单一布局。当用户点击它时,它会打开Facebook访问页面,并在成功登录时显示与配置文件图片和名称相同的布局。我想获取并将电子邮件ID和Facebook用户ID保存到本地数据库,并在下次登录时检查数据库中的电子邮件ID以进行登录。这是因为,即使用户从“设置”中清除数据,用户也不必再次访问Facebook访问页面。它将搜索本地数据库并登录。

SQLite数据库

public class MainActivity extends Activity {
    CallbackManager callbackManager;
    Button share,details;
    ShareDialog shareDialog;
    LoginButton login;
    ProfilePictureView profile;
    Dialog details_dialog;
    TextView details_txt;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_main);

        callbackManager = CallbackManager.Factory.create();
        login = (LoginButton)findViewById(R.id.login_button);
        profile = (ProfilePictureView)findViewById(R.id.picture);
        shareDialog = new ShareDialog(this);
        share = (Button)findViewById(R.id.share);
        details = (Button)findViewById(R.id.details);
        login.setReadPermissions("public_profile email");
        share.setVisibility(View.INVISIBLE);
        details.setVisibility(View.INVISIBLE);
        details_dialog = new Dialog(this);
        details_dialog.setContentView(R.layout.dialog_details);
        details_dialog.setTitle("Details");
        details_txt = (TextView)details_dialog.findViewById(R.id.details);
        details.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                details_dialog.show();
            }
        });


        if(AccessToken.getCurrentAccessToken() != null){
            RequestData();
            share.setVisibility(View.VISIBLE);
            details.setVisibility(View.VISIBLE);
        }
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(AccessToken.getCurrentAccessToken() != null) {
                    share.setVisibility(View.INVISIBLE);
                    details.setVisibility(View.INVISIBLE);
                    profile.setProfileId(null);
                }
            }
        });
        share.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ShareLinkContent content = new ShareLinkContent.Builder().build();
                shareDialog.show(content);

            }
        });
        login.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {

                if(AccessToken.getCurrentAccessToken() != null){
                    RequestData();
                    share.setVisibility(View.VISIBLE);
                    details.setVisibility(View.VISIBLE);
                }
            }

            @Override
            public void onCancel() {

            }

            @Override
            public void onError(FacebookException exception) {
            }
        });

    }
    public void RequestData(){
        GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(JSONObject object,GraphResponse response) {

                JSONObject json = response.getJSONObject();
                try {
                    if(json != null){
                        String text = "<b>Name :</b> "+json.getString("name")+"<br><br><b>Email :</b> "+json.getString("email")+"<br><br><b>Profile link :</b> "+json.getString("link");
                        details_txt.setText(Html.fromHtml(text));
                        profile.setProfileId(json.getString("id"));
                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
        Bundle parameters = new Bundle();
        parameters.putString("fields", "id,name,link,email,picture");
        request.setParameters(parameters);
        request.executeAsync();
    }

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



}

MainActivity

redirect('/');

2 个答案:

答案 0 :(得分:2)

以下是解决方案: Android Facebook SDK 4.X , how to get Email address and Facebook Access Token to pass it to Web Service

如果用户从设置中清除数据,您的数据库将被清空。

答案 1 :(得分:0)

有两个关于如何完成的方案

首先:您允许用户通过Facebook登录并将其访问令牌(由facebook提供)存储在sharedpreferences中,并在每次用户返回您的应用时检查sharedpreferences。 这里访问令牌的到期时间由facebook处理,因此您不必担心这一点。

第二:关于你的后端拿走facebook的访问令牌并用你生成的访问令牌替换它,在这里你要处理远程服务器上令牌的到期。

但是,在这两种情况下,访问令牌都存储在您sharedpreferences中,或者即使您将其存储在sqlite本地数据库(您不应该)中,也会将其存储在清除sharedpreferences和sqlite db的设置中的> app 数据已被清除,因此无法确认用户的身份。 因此,用户必须再次登录,这根本不是一件坏事。应该被允许这样做。