[英]Facebook login from activity fails?
我在一个活动中有一个自定义按钮,用于允许用户通过Facebook登录。 我的点击代码如下所示:
CallbackManager callback = CallbackManager.Factory.create();
List<String> permissions = Arrays.asList("email","public_profile");
LoginManager.getInstance().logInWithReadPermissions(this,permissions);
LoginManager.getInstance().registerCallback(callback, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
setUserLoggedIn(PrefUtils.Values.LOG_IN_METHOD_FACEBOOK);
}
@Override
public void onCancel() {
// todo: something
}
@Override
public void onError(FacebookException error) {
Logger.d("TAG",error.getMessage());
}
});
但是,不会显示FB登录对话框。 相反,我最终看到一个错误对话框,要求我登录。 我以为这将启动显示用户名和密码编辑文本的对话框。
如何获得该登录对话框?
单击自定义fb按钮打开fb_login对话框
fb_login_button.performClick();
事实证明,文档中没有提到一小步。 从调试密钥库计算完哈希后,您必须在开发人员资料中单击“添加平台”,然后选择“ Android”并按照屏幕上的说明进行操作。
将其放在按钮上,单击onClick()方法
Fblogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
LoginManager.getInstance().logInWithReadPermissions(context,
Arrays.asList("email", "user_photos", "public_profile"));
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callback.onActivityResult(requestCode, resultCode, data);
}
将您的回调设为全局变量,即在您的以下将其初始化
FacebookSdk.sdkInitialize(getApplicationContext());
还要重写您的活动的OnActivityForResult方法,并按如下所示添加callback.onActivityResult(requestCode,resultCode,data)。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callback.onActivityResult(requestCode, resultCode, data);
}
希望这可以帮助。 如果没有让我知道。
做这个步骤
在开始时声明此变量
公共CallbackManager callbackManager;
呼叫波纹管功能
私人无效initializeFacebookSdk(){
FacebookSdk.sdkInitialize(getApplicationContext()); callbackManager = CallbackManager.Factory.create(); }
在按钮上单击调用此功能
受保护的void connectToFacebook(){
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email", "user_photos", "user_friends", "public_profile", "user_birthday")); LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(final LoginResult loginResult) { // App code GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { @Override public void onCompleted(JSONObject json, GraphResponse response) { Log.v("FaceBook Response :", response.toString()); } }); Bundle parameters = new Bundle(); parameters.putString("fields", "id,name,first_name,last_name,gender, birthday,email,link,picture"); request.setParameters(parameters); request.executeAsync(); } @Override public void onCancel() { Log.v("LoginActivity", "cancel"); } @Override public void onError(FacebookException exception) { Utils.showToast(mActivity, "" + exception); } }); }
在这里,我正在分享我的工作代码。 希望对您有帮助。
在您的应用程序类内部oncreate
FacebookSdk.sdkInitialize(getApplicationContext());
然后将facebook LoginButton放入您的布局,并将其可见性设置为“消失”。 然后在自定义按钮的onclick中编写以下代码:
btnFBLogin.performClick(); //btnFBLogin is the Facebook LoginButton.
初始化LoginButton后不要忘记添加此内容
btnLoginFB.setReadPermissions(Arrays.asList("email", "user_birthday"));
并在初始化callbackmanager之后在oncreate中调用此函数。
callbackManager = CallbackManager.Factory.create();
registerfb_callback();
这是registerfb_callback()函数
/*Registering fb callback*/
private void registerfb_callback(){
btnLoginFB.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
showProgressDialog(); //Show dialog as your wish
String accessToken = loginResult.getAccessToken().getToken();
Log.i("accessToken", accessToken);
GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
//Here I am logging out after completing the call.
LoginManager.getInstance().logOut();
progressDialog.hide();
try {
if(object != null) {
System.out.println("GraphResponse" + response.toString());
System.out.println("JSONObjectResponse" + object.toString());
Log.i("Activity", response.toString());
// Get facebook data from login
Bundle bFacebookData = getFacebookData(object);
}
}catch (Exception e){
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id, first_name, last_name, email,gender, birthday, location"); // Parámetros que pedimos a facebook
request.setParameters(parameters);
request.executeAsync();
}
@Override
public void onCancel() {
System.out.println("onCancel");
}
@Override
public void onError(FacebookException exception) {
Toast.makeText(Registration.this,"Network Error! Please try again!",Toast.LENGTH_LONG).show();
System.out.println("onError"+exception.toString());
}
});
}
从JSON对象获取解析的数据
/*Parsing facebook data from JSON Object*/
private Bundle getFacebookData(JSONObject object) {
Bundle bundle = new Bundle();
try {
String id = object.getString("id");
try {
URL profile_pic = new URL("https://graph.facebook.com/" + id + "/picture?width=200&height=150");
Log.i("profile_pic", profile_pic + "");
bundle.putString("profile_pic", profile_pic.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
}
bundle.putString("idFacebook", id);
if (object.has("first_name"))
bundle.putString("first_name", object.getString("first_name"));
if (object.has("last_name"))
bundle.putString("last_name", object.getString("last_name"));
if (object.has("email"))
bundle.putString("email", object.getString("email"));
if (object.has("gender"))
bundle.putString("gender", object.getString("gender"));
if (object.has("birthday"))
bundle.putString("birthday", object.getString("birthday"));
if (object.has("location"))
bundle.putString("location", object.getJSONObject("location").getString("name"));
return bundle;
}catch (JSONException e){
e.printStackTrace();
}
return bundle;
}
最后是onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
希望它会有所帮助:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.