Android Facebook SDK 4.0 使用 LoginManager 登录
Android Facebook SDK 4.0 login with LoginManager
我正在尝试将旧应用程序的登录代码从 SDK 3.0 迁移到 SDK 4.0。
我已经使用 LoginManager
实现了登录,因为我有自定义登录按钮。
问题是我没有收到来自 Facebook API 的回复。没有成功,没有错误,没有抛出任何异常。代码如下:
//global refs
//callbacks
private CallbackManager mCallbackManager;
private FacebookCallback<LoginResult> mFacebookCallback;
private List<String> mPermissions = Arrays.asList("email");
private LoginManager mLoginMgr;
private Activity mActivity;
//........
//code is inside method
FacebookSdk.sdkInitialize(getApplicationContext());
//perhaps a bit excessive
FacebookSdk.addLoggingBehavior(LoggingBehavior.GRAPH_API_DEBUG_INFO);
FacebookSdk.addLoggingBehavior(LoggingBehavior.DEVELOPER_ERRORS);
FacebookSdk.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);
FacebookSdk.addLoggingBehavior(LoggingBehavior.INCLUDE_RAW_RESPONSES);
FacebookSdk.setApplicationId(mActivity.getString(R.string.sample_fb_id));
//init callbacks
mFacebookCallback = new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.v("LoginActivity login", loginResult.toString());
GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
// Application code
Log.v("LoginActivity", response.toString());
try {
String email = object.getString("email");
Log.v("LoginActivity", "obtained email: ", email);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
request.executeAsync();
}
@Override
public void onCancel() {
Log.e("LoginActivity", "facebook login canceled");
}
@Override
public void onError(FacebookException e) {
Log.e("LoginActivity", "facebook login failed error");
}
};
mCallbackManager = CallbackManager.Factory.create();
mLoginMgr = LoginManager.getInstance();
mLoginMgr.registerCallback(mCallbackManager, mFacebookCallback);
mLoginMgr.logInWithReadPermissions(mActivity, mPermissions);
使用 Debugger
,我可以看到这一行:
mLoginMgr.logInWithReadPermissions(mActivity, mPermissions);
被执行,但 callbacks
的 none 被触发。我在控制台也没有错误,设备屏幕变黑,没有任何反应。
我认为这无关紧要,但代码是在包装器 class 中执行的(在 Activity
之外)。我在 Activity
内试过,但没有任何区别。
有什么建议吗?
非常感谢。
编辑:
这是在AndroidManifest.xml
中声明的:
<activity android:name="com.facebook.FacebookActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name" />
如果您的代码在片段中,请不要使用 mActivity 变量作为 Activity 上下文。
待办事项:
添加一行:
callbackManager.onActivityResult(requestCode, resultCode, data); in onActivityResult(, , , ) in fragment.
通话:
LoginManager.getInstance().logInWithReadPermissions(**this**, Arrays.asList("public_profile", "user_friends"));
使用this,不使用this.getActivity()
- 好的,完成。
我也有这个问题。结果我忘了按照登录指南 Register a Callback section 的底部在 Activity.onActivityResult()
中添加对 callbackManager.onActivityResult()
的调用。
因此,在您进行 Facebook 登录的 Activity 中,您应该有如下内容:
@Override
protected void onActivityResult(int request, int result, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mCallbackManager.onActivityResult(request, result, data);
}
这是你错过的吗?
/** login manager */
public void initializeLoginManager(){
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
}
@Override
public void onCancel() {
// App code
}
@Override
public void onError(FacebookException exception) {
// App code
}
});
}
public void onClick(View view) {
switch(view.getId()){
case R.id.button_login_login :
firebaseloginEmail();
break;
case R.id.text_forget_password : break;//TODO: implement This with the layout
case R.id.text_dont_account_login :
startActivity(new Intent(this,SignupActivity.class));
finish();
break;
case R.id.button_facebook_login :
Log.e("facebook login","You have clicked");
LoginManager.getInstance().logInWithReadPermissions(LoginActivity.this,Arrays.asList(EMAIL));
break;
}
}
我正在尝试将旧应用程序的登录代码从 SDK 3.0 迁移到 SDK 4.0。
我已经使用 LoginManager
实现了登录,因为我有自定义登录按钮。
问题是我没有收到来自 Facebook API 的回复。没有成功,没有错误,没有抛出任何异常。代码如下:
//global refs
//callbacks
private CallbackManager mCallbackManager;
private FacebookCallback<LoginResult> mFacebookCallback;
private List<String> mPermissions = Arrays.asList("email");
private LoginManager mLoginMgr;
private Activity mActivity;
//........
//code is inside method
FacebookSdk.sdkInitialize(getApplicationContext());
//perhaps a bit excessive
FacebookSdk.addLoggingBehavior(LoggingBehavior.GRAPH_API_DEBUG_INFO);
FacebookSdk.addLoggingBehavior(LoggingBehavior.DEVELOPER_ERRORS);
FacebookSdk.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);
FacebookSdk.addLoggingBehavior(LoggingBehavior.INCLUDE_RAW_RESPONSES);
FacebookSdk.setApplicationId(mActivity.getString(R.string.sample_fb_id));
//init callbacks
mFacebookCallback = new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.v("LoginActivity login", loginResult.toString());
GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
// Application code
Log.v("LoginActivity", response.toString());
try {
String email = object.getString("email");
Log.v("LoginActivity", "obtained email: ", email);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
request.executeAsync();
}
@Override
public void onCancel() {
Log.e("LoginActivity", "facebook login canceled");
}
@Override
public void onError(FacebookException e) {
Log.e("LoginActivity", "facebook login failed error");
}
};
mCallbackManager = CallbackManager.Factory.create();
mLoginMgr = LoginManager.getInstance();
mLoginMgr.registerCallback(mCallbackManager, mFacebookCallback);
mLoginMgr.logInWithReadPermissions(mActivity, mPermissions);
使用 Debugger
,我可以看到这一行:
mLoginMgr.logInWithReadPermissions(mActivity, mPermissions);
被执行,但 callbacks
的 none 被触发。我在控制台也没有错误,设备屏幕变黑,没有任何反应。
我认为这无关紧要,但代码是在包装器 class 中执行的(在 Activity
之外)。我在 Activity
内试过,但没有任何区别。
有什么建议吗? 非常感谢。
编辑:
这是在AndroidManifest.xml
中声明的:
<activity android:name="com.facebook.FacebookActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name" />
如果您的代码在片段中,请不要使用 mActivity 变量作为 Activity 上下文。
待办事项:
添加一行:
callbackManager.onActivityResult(requestCode, resultCode, data); in onActivityResult(, , , ) in fragment.
通话:
LoginManager.getInstance().logInWithReadPermissions(**this**, Arrays.asList("public_profile", "user_friends"));
使用this,不使用this.getActivity()
- 好的,完成。
我也有这个问题。结果我忘了按照登录指南 Register a Callback section 的底部在 Activity.onActivityResult()
中添加对 callbackManager.onActivityResult()
的调用。
因此,在您进行 Facebook 登录的 Activity 中,您应该有如下内容:
@Override
protected void onActivityResult(int request, int result, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mCallbackManager.onActivityResult(request, result, data);
}
这是你错过的吗?
/** login manager */
public void initializeLoginManager(){
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
}
@Override
public void onCancel() {
// App code
}
@Override
public void onError(FacebookException exception) {
// App code
}
});
}
public void onClick(View view) {
switch(view.getId()){
case R.id.button_login_login :
firebaseloginEmail();
break;
case R.id.text_forget_password : break;//TODO: implement This with the layout
case R.id.text_dont_account_login :
startActivity(new Intent(this,SignupActivity.class));
finish();
break;
case R.id.button_facebook_login :
Log.e("facebook login","You have clicked");
LoginManager.getInstance().logInWithReadPermissions(LoginActivity.this,Arrays.asList(EMAIL));
break;
}
}