<< EDITED >>
我正在尝试在我的Android应用程序中升级facebook SDK.我正在关注facebook开发者网站上的文档.我想做一些修改
1)我想从DialogFragment登录而不是直接在活动中
2)我想使用我自己的按钮进行Facebook登录
这就是我的活动:
public class MainActivity extends ActionBarActivity {
private static final String TAG = MainActivity.class.getName();
private CallbackManager mFBCallbackManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Setup FB SDK add login callback
FacebookSdk.sdkInitialize(this.getApplicationContext());
mFBCallbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(mFBCallbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.d(TAG, "FB Login successfull");
}
@Override
public void onCancel() {
Log.d(TAG, "FB Login cancelled");
}
@Override
public void onError(FacebookException e) {
Log.d(TAG, "Error while performing FB login", e);
}
});
// Open login dialog
Button loginBtn = (Button) findViewById(R.id.login_btn);
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new LoginDialog().show(getSupportFragmentManager(), TAG);
}
});
}
@Override
protected void onActivityResult( int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// foward onActivityResult call to the FB callback manager
mFBCallbackManager.onActivityResult(requestCode, requestCode, data);
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我的DialogFragment的样子:
public class LoginDialog extends DialogFragment {
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
View rootView = inflater.inflate(R.layout.login_dialog, null);
Button fbLoginBtn = (Button) rootView.findViewById(R.id.fb_login_btn);
fbLoginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LoginManager.getInstance().logInWithReadPermissions(
getActivity(),
Arrays.asList("basic_info"));
}
});
builder.setView(rootView);
return builder.create();
}
}
Run Code Online (Sandbox Code Playgroud)
我认为设置看起来像Facebook提到的所需步骤,但我是我的FacebookCallback.onError(FacebookException)被调用在logcat上显示这个.异常"对LoginManager.onActivityResult的意外调用"的特定消息
04-03 12:01:26.390 8229-8229/com.jpdevs.fbv23 D/com.jpdevs.fbv23.MainActivity? Error while performing FB login
Unexpected call to LoginManager.onActivityResult
at com.facebook.login.LoginManager.onActivityResult(LoginManager.java:187)
at com.facebook.login.LoginManager$1.onActivityResult(LoginManager.java:140)
at com.facebook.internal.CallbackManagerImpl.onActivityResult(CallbackManagerImpl.java:82)
at com.jpdevs.fbv23.MainActivity.onActivityResult(MainActivity.java:65)
at android.app.Activity.dispatchActivityResult(Activity.java:6135)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3535)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3582)
at android.app.ActivityThread.access$1300(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1327)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Run Code Online (Sandbox Code Playgroud)
如果您想了解更多细节,我在整个项目中创建了这个回购:https://github.com/jorgep19/fb_login
Sul*_*ain 26
我有这个问题,当我告诉你"秘密"时你会做一个facepalm.如果你只是希望解决方案走到尽头,我会解释为什么会加薪.
当发生这种情况时,facebook的源代码会抛出此错误:
if (exception == null && newToken == null && !isCanceled) {
exception = new FacebookException("Unexpected call to LoginManager.onActivityResult");
}
Run Code Online (Sandbox Code Playgroud)
所以这3个参数正在发生一些事情.
我正在阅读代码,我发现这可能是resultCode的一些问题,因为它没有返回Activity.RESULT_OK.
关键:你已经在resultCode参数上传递了两次requestCode ...只需改变这个:
mFBCallbackManager.onActivityResult(requestCode, requestCode, data);
Run Code Online (Sandbox Code Playgroud)
通过
mFBCallbackManager.onActivityResult(requestCode, resultCode, data);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2094 次 |
| 最近记录: |