【问题标题】:save facebook id and email to local database将 facebook id 和电子邮件保存到本地数据库
【发布时间】:2023-03-27 11:35:02
【问题描述】:

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

SQLite 数据库

public class SQLiteHandler extends SQLiteOpenHelper {

    private static final String TAG = SQLiteHandler.class.getSimpleName();

    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "android_api";

    // Login table name
    private static final String TABLE_USER = "user";

    // Login Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_EMAIL = "email";
    private static final String KEY_UID = "uid";

    public SQLiteHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_USER + "("
                + KEY_ID + " INTEGER PRIMARY KEY,"
                + KEY_EMAIL + " TEXT UNIQUE," + KEY_UID + " TEXT"+")";
        db.execSQL(CREATE_LOGIN_TABLE);

        Log.d(TAG, "Database tables created");
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER);

        // Create tables again
        onCreate(db);
    }

    /**
     * Storing user details in database
     * */
    public void addUser(String name, String email, String uid, String created_at) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_EMAIL, email); // Email
        values.put(KEY_UID, uid); // Email

        // Inserting Row
        long id = db.insert(TABLE_USER, null, values);
        db.close(); // Closing database connection

        Log.d(TAG, "New user inserted into sqlite: " + id);
    }

    /**
     * Getting user data from database
     * */
    public HashMap<String, String> getUserDetails() {
        HashMap<String, String> user = new HashMap<String, String>();
        String selectQuery = "SELECT  * FROM " + TABLE_USER;

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        // Move to first row
        cursor.moveToFirst();
        if (cursor.getCount() > 0) {
            user.put("email", cursor.getString(1));
            user.put("uid", cursor.getString(2));
        }
        cursor.close();
        db.close();
        // return user
        Log.d(TAG, "Fetching user from Sqlite: " + user.toString());

        return user;
    }

    /**
     * Re crate database Delete all tables and create them again
     * */
    public void deleteUsers() {
        SQLiteDatabase db = this.getWritableDatabase();
        // Delete All Rows
        db.delete(TABLE_USER, null, null);
        db.close();

        Log.d(TAG, "Deleted all user info from 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);
    }



}

【问题讨论】:

    标签: android facebook android-sqlite


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。这有助于我保存电子邮件和用户 ID。但是如何在成功登录时转到不同的布局以显示个人资料?
    • 登录成功后,您可以将值存储在共享首选项或数据库中并显示在其他页面上。对于个人资料图片,您可以使用:profilePictureView.setProfileId(fb_user_id);,它将直接在 Facebook ProfilePictureView 小部件中显示个人资料图片
    • 那么,我应该在 fbloginBtn.setonclicklistener 中添加 Intent 吗?我很抱歉问它对我来说很新。 @Ronish。
    • 您可以在 updateUI() 方法上使用意图,因此在成功登录后用户将被重定向到新活动,即使您可以在数据存储到数据库后重定向。 private void updateUI() { Session session = Session.getActiveSession(); boolean enableButtons = (session != null &amp;&amp; session.isOpened()); if (enableButtons &amp;&amp; user != null) { Intent i = new Intent(getApplicationContext(),MainActivity.class); startActivity(i); } }
    • 太棒了。谢谢回复。你让我今天一整天都感觉很好。 @Ronish。
    【解决方案2】:

    有两种情况是如何完成的

    首先:您让用户通过 facebook 登录并将其访问令牌(由 facebook 提供)存储在 sharedpreferences 中,并在用户每次返回您的应用时检查 sharedpreferences。 这里访问令牌的到期由 facebook 处理,因此您不会那么头疼。

    第二:在您的后端获取 facebook 的访问令牌并将其替换为您生成的访问令牌,在这里您需要处理远程服务器上令牌的到期问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2014-11-22
      • 2012-01-25
      • 2018-04-17
      相关资源
      最近更新 更多