Android 请求数据(); share.setVisibility(View.VISIBLE); details.setVisibility(View.VISIBLE); } } @凌驾 公开作废{ } @凌驾 public void onError(facebook异常){ } }); } public void RequestData(){ GraphRequest request=GraphRequest.NewMereRequest(AccessToken.getCurrentAccessToken(),new GraphRequest.GraphJSONObjectCallback()){ @凌驾 未完成公共无效(JSONObject对象,GraphResponse响应){ JSONObject json=response.getJSONObject(); 试一试{ if(json!=null){ String text=“Name:”+json.getString(“Name”)+”电子邮件:“+json.getString(“Email”)+”配置文件链接:“+json.getString(“link”); details_txt.setText(Html.fromHtml(text)); setProfileId(json.getString(“id”); } }捕获(JSONException e){ e、 printStackTrace(); } } }); Bundle参数=新Bundle(); putString(“字段”、“id、名称、链接、电子邮件、图片”); 请求。设置参数(参数); request.executeAsync(); } @凌驾 受保护的void onActivityResult(int请求代码、int结果代码、意图数据){ super.onActivityResult(请求代码、结果代码、数据); callbackManager.onActivityResult(请求代码、结果代码、数据); } }

Android 请求数据(); share.setVisibility(View.VISIBLE); details.setVisibility(View.VISIBLE); } } @凌驾 公开作废{ } @凌驾 public void onError(facebook异常){ } }); } public void RequestData(){ GraphRequest request=GraphRequest.NewMereRequest(AccessToken.getCurrentAccessToken(),new GraphRequest.GraphJSONObjectCallback()){ @凌驾 未完成公共无效(JSONObject对象,GraphResponse响应){ JSONObject json=response.getJSONObject(); 试一试{ if(json!=null){ String text=“Name:”+json.getString(“Name”)+”电子邮件:“+json.getString(“Email”)+”配置文件链接:“+json.getString(“link”); details_txt.setText(Html.fromHtml(text)); setProfileId(json.getString(“id”); } }捕获(JSONException e){ e、 printStackTrace(); } } }); Bundle参数=新Bundle(); putString(“字段”、“id、名称、链接、电子邮件、图片”); 请求。设置参数(参数); request.executeAsync(); } @凌驾 受保护的void onActivityResult(int请求代码、int结果代码、意图数据){ super.onActivityResult(请求代码、结果代码、数据); callbackManager.onActivityResult(请求代码、结果代码、数据); } },android,facebook,android-sqlite,Android,Facebook,Android Sqlite,以下是解决方案: 无论如何,如果用户从设置中清除数据,您的数据库将被清空。关于如何完成此操作,有两种方案 首先:您允许用户通过facebook登录,并将其访问令牌(由facebook提供)存储在SharedReferences中,并在用户每次返回应用程序时检查SharedReferences。 在这里,访问令牌的过期由facebook负责,所以您不会感到头痛 第二步:在您的后端,使用facebook的访问令牌,并将其替换为您生成的访问令牌,在这里,您负责远程服务器上令牌的过期 然而,在这两种情

以下是解决方案:


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

关于如何完成此操作,有两种方案

首先:您允许用户通过facebook登录,并将其访问令牌(由facebook提供)存储在
SharedReferences
中,并在用户每次返回应用程序时检查
SharedReferences
。 在这里,访问令牌的过期由facebook负责,所以您不会感到头痛

第二步:在您的后端,使用facebook的访问令牌,并将其替换为您生成的访问令牌,在这里,您负责远程服务器上令牌的过期

然而,在这两种情况下,访问令牌都存储在您的
SharedReferences
中,或者即使您将其存储在
sqlite
local db中(您不应该这样),在清除设置中的app数据时,您的
SharedReferences
sqlite
db都被清除,所以无法确认用户的身份。
因此,用户必须再次登录,这一点也不坏&应该允许用户再次登录。

谢谢您的回答。这有助于我保存电子邮件和用户ID。但是,如何在成功登录时转到其他布局以显示配置文件?成功登录后,您可以将值存储在共享首选项或数据库中,并显示在其他页面上。对于配置文件图片,您可以使用:
profilePictureView.setProfileId(fb\u user\u id)
这将直接在Facebook ProfilePictureView widgetSo中显示配置文件图片,我是否应该在fbloginBtn.setonclicklistener中添加该意图?我很抱歉问你,因为这对我来说很新鲜@您可以使用intent on updateUI()方法,因此在成功登录后,用户将被重定向到新活动,即使您可以在数据存储到数据库后重定向
private void updateUI(){Session Session=Session.getActiveSession();boolean enableButtons=(Session!=null&&Session.isOpened());if(enableButtons&&user!=null){Intent i=newintent(getApplicationContext(),MainActivity.class);startActivity(i);}
。谢谢你的回复。你让我开心@浪人。
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);
    }



}