【问题标题】:cannot display Facebook user profile information into android studio after authenticating验证后无法在 android studio 中显示 Facebook 用户个人资料信息
【发布时间】:2017-12-10 05:36:04
【问题描述】:

我花了大约 4 天时间观看了 100 个有关此问题的视频,这是我在 stackoverflow 上的第一个问题,也是我的第一个应用程序,我希望有人能帮助我 这是我的登录活动,其中包括 Facebook 登录:

public class LoginActivity extends AppCompatActivity  {
Button createaccount;
Button login;
private FirebaseAuth mAuth;
ProgressBar progressBar;
public static final String EXTRA_MESSAGE = "com.fathy.reufamnew.MESSAGE";
TextView testys;
private EditText mEmailView;
private EditText mPasswordView;
LoginButton facebutton;
ImageView imgavatar;
CallbackManager callbackManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    callbackManager=CallbackManager.Factory.create();
    setContentView(R.layout.activity_login);
    login=(Button)findViewById(R.id.login);
    mAuth=FirebaseAuth.getInstance();
    facebutton=(LoginButton)findViewById(R.id.fb_login);
    testys=(TextView)findViewById(R.id.testys) ;
    progressBar=(ProgressBar)findViewById(R.id.progressbar);
    mEmailView = (EditText) findViewById(R.id.emailnow);
    mPasswordView = (EditText) findViewById(R.id.password1);

    facebutton.setReadPermissions(Arrays.asList("public_profile","email","user_birthday","user_hometown","user_about_me"));
    facebutton.registerCallback(callbackManager, new FacebookCallback <LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {

            String  accesstoken =loginResult.getAccessToken().getToken();
            GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {

                @Override
                public void onCompleted(JSONObject object, GraphResponse response) {
                    Intent intent=new Intent(LoginActivity.this,Facebook.class);
                    intent.putExtra("object",object.toString());
                    startActivity(intent);

                    Log.v("response", response.toString());
                }
            });
            Bundle parameters = new Bundle();
            parameters.putString("fields", "id, first_name, age_range,last_name, email, birthday, gender,location.fields(location)"); // Parámetros que pedimos a facebook
            request.setParameters(parameters);
            request.executeAsync();
            testys.setText("Login Sucess\n"+loginResult.getAccessToken().getUserId());
        }

        @Override
        public void onCancel() {
            testys.setText("login canceled");
        }

        @Override
        public void onError(FacebookException error) {

        }
    });
}



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


private void attemptLogin() {

    login=(Button)findViewById(R.id.login);
    // Store values at the time of the login attempt.
    String email = mEmailView.getText().toString();
    String password = mPasswordView.getText().toString();

    if(email.isEmpty()) {
        mEmailView.setError("E-mail is Required");
        mEmailView.requestFocus();
        return;
    }

    if(!Patterns.EMAIL_ADDRESS.matcher(email).matches()){
        mEmailView.setError("Please Enter A Valid Email");
        mEmailView.requestFocus();
        return;

    }
    if(password.isEmpty()) {
        mPasswordView.setError("Password is Required");
        mPasswordView.requestFocus();
        return;

    }
    if(password.length()<6){
        mPasswordView.setError("Password is too short(Not Less than 6)");
        mPasswordView.requestFocus();
        return;

    }
    Toast.makeText(this, "Login in Progress", Toast.LENGTH_LONG).show();
    progressBar.setVisibility(View.VISIBLE);

    mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(this, new OnCompleteListener <AuthResult>() {
        @Override
        public void onComplete(@NonNull Task <AuthResult> task) {
            if (task.isSuccessful()) {
                finish();
                progressBar.setVisibility(View.GONE);
                Intent intent=new Intent(LoginActivity.this,MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
            } else {
                progressBar.setVisibility(View.GONE);
                Toast.makeText(getApplicationContext(),task.getException().getMessage(),Toast.LENGTH_LONG).show();                }
        }

    });
}


public void showerrordialog(String message){
    new AlertDialog.Builder(this)
            .setTitle("OoOps")
            .setMessage(message)
            .setPositiveButton(android.R.string.ok,null)
            .setIcon(android.R.drawable.ic_dialog_alert)
            .show();
}
public void createaccountonclick(View view){
    createaccount=(Button)findViewById(R.id.createaccount);
    Intent intent=new Intent(this,UserProfile.class);
    finish();
    startActivity(intent);
}
public void LogMeIn(View view){
    login=(Button)findViewById(R.id.login);
    attemptLogin();
}

@Override
protected void onStart() {
    super.onStart();
    if(mAuth.getCurrentUser()!=null){
        finish();
        Intent intent=new Intent(LoginActivity.this,RestoreProfileData.class);
        startActivity(intent);
    }
}

}

这是我将其命名为 facebook 的第二个活动,它将获取个人资料图片、姓名、电子邮件和性别

public class Facebook extends AppCompatActivity {
TextView email;
TextView gender;
TextView facebookName;
LinearLayout infoLayout;
ProfilePictureView profilePictureView;
ImageView ima;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_facebook);
    infoLayout = (LinearLayout) findViewById(R.id.layout_info);
    profilePictureView = (ProfilePictureView) findViewById(R.id.image);
    gender = (TextView) findViewById(R.id.gender);
    ima=(ImageView)findViewById(R.id.imaging);
    facebookName = (TextView) findViewById(R.id.facebookname);
    email = (TextView) findViewById(R.id.email);
    try {
        JSONObject jsonObj = new JSONObject(getIntent().getStringExtra("object"));
        getdata(jsonObj);
    } catch (JSONException e) {
        e.printStackTrace();
    }



}

private void getdata(JSONObject object) {

    try{


        URL profile_pic =new URL("https://graph.facebook.com/"+object.getString("id")+"/picture?width=250&height=250");

        Picasso.with(this).load(profile_pic.toString()).into(ima);
        String fathy= object.getString("email");
        email.setText(fathy);
        facebookName.setText(object.getString("first_name"));
        gender.setText(object.getString("gender"));

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

}

我想获取使用 facebook 凭据登录的用户的姓名、性别和电子邮件

我只是获取用户的个人资料图片,但其他数据为空 没有错误

【问题讨论】:

    标签: android facebook android-studio facebook-graph-api facebook-javascript-sdk


    【解决方案1】:

    问题在于您传递给 Graph API 的参数。试试这个

    parameters.putString("fields",
    "id, first_name,last_name, email, birthday, gender");
    

    并尝试通过启用 HTTP 日志来调试您的代码。

    FacebookSdk.addLoggingBehavior(LoggingBehavior.REQUESTS);
    

    像这样提供读取权限。

    LoginManager.getInstance().logInWithReadPermissions(this,Arrays.asList("email"));
    

    【讨论】:

    • 感谢您的回复,但不幸的是,在插入您推荐的代码后它也不起作用。显示相同的个人资料图片,但没有显示电子邮件或性别的值,我在日志猫中得到了这个:W/System.err:org.json.JSONException:没有电子邮件值 W/System.err:在 org.json.JSONObject。 get(JSONObject.java:389) W/System.err: 在 org.json.JSONObject.getString(JSONObject.java:550) W/System.err: 在 com.fathy.reufamy.Facebook.getdata(Facebook.java: 61) com.fathy.reufamy.Facebook.onCreate(Facebook.java:44)
    • 尝试添加性别权限
    • 所以我认为这意味着问题出在提取邮件和性别的 getdata 方法中,但我不知道问题出在哪里
    • 您是否尝试过记录 HTTP 响应。首先检查是否从 Facebook graph api 收到所有数据
    • 我已经在登录活动 facebutton.setReadPermissions(Arrays.asList("public_profile","email","user_birthday","user_hometown","user_about_me"));
    【解决方案2】:

    对于任何路过我的帖子并遇到同样问题的人,我终于解决了问题

    这是电子邮件部分,有时 API 不回复电子邮件,因为用户正在使用电话号码操作他的 Facebook 帐户,并且他/她没有任何与 Facebook 帐户关联的电子邮件

    所以我从参数和读取权限中删除了电子邮件一词 我终于得到了用户的用户名、性别和生日。

    我改了 parameters.putString("fields", "id, first_name, age_range,last_name, email,birthday,gender);

    到 parameters.putString("fields", "id, first_name, age_range,last_name,birthday,gender,);

    还有读取权限 从 facebutton.setReadPermissions(Arrays.asList("public_profile","email","user_birthday","user_hometown","user_about_me"));

    改为

    facebutton.setReadPermissions(Arrays.asList("public_profile","user_birthday","user_hometown","user_about_me"));

    希望对未来的人有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多