首页 > 解决方案 > 在android中使用facebook登录时没有调用onActivityResult

问题描述

我已经集成了 Facebook 并在 Facebook 开发者帐户中创建了应用程序。我已经在 facebook 开发者帐户中注册了 FBHelper 活动,一旦我收到数据/facebook 详细信息,我就使用了 setResult 方法,但它没有调用 LoginActivity.java 的 onActivityResult() 方法。

代码:LoginAcitivity.java

 Intent intent = new Intent(LoginActivity.this, FBHelper.class);

                startActivityForResult(intent,2);

LoginActivity.java 的 onActivityResult()

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);


       if (requestCode == 2 && resultCode == RESULT_OK) {

            String jsondata=data.getStringExtra("userProfile");
            try {


                JSONObject response = new JSONObject(jsondata);
                String email = (response.get("email").toString());
                String fname = (response.get("first_name").toString());
                String lname = (response.get("last_name").toString());
                String id = (response.get("id").toString());
                Toast.makeText(loginActivity,"facebook", Toast.LENGTH_SHORT).show();
                Social_Login(email, id, fname, lname, "facebook");

            } catch(Exception e){
                e.printStackTrace();
            }

        }
}

FBHelper.java

public class FBHelper extends AppCompatActivity {
CallbackManager callbackManager;
private CallbackManager mFacebookCallbackManager;
private Context myActivity;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fb_helper);
    try {
        FacebookSdk.sdkInitialize(getApplicationContext());
        AppEventsLogger.activateApp(this);
        callbackManager = CallbackManager.Factory.create();
        AccessToken accessToken = AccessToken.getCurrentAccessToken();
        boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
       LoginManager.getInstance().logOut();
        LoginManager.getInstance().logInWithReadPermissions(FBHelper.this, Arrays.asList("public_profile", "email"));
        LoginManager.getInstance().setLoginBehavior(LoginBehavior.DEVICE_AUTH);


        LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                getUserDetails(loginResult);
            }

            @Override
            public void onCancel() {
                // App code
                Log.v("onCancel", "onCancel");
            }

            @Override
            public void onError(FacebookException exception) {
                // App code
                exception.printStackTrace();
                Log.v("onError", "CANCEL");
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try {
        callbackManager.onActivityResult(requestCode, resultCode, data);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

protected void getUserDetails(LoginResult loginResult) {
    GraphRequest data_request = GraphRequest.newMeRequest(
            AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(
                        JSONObject json_object, GraphResponse response) {
                    try {
                        Intent returnIntent = new Intent();
                        returnIntent.putExtra("userProfile", json_object.toString());
                        setResult(RESULT_OK, returnIntent);
                       // LoginManager.getInstance().logOut();
                        finish();
                    } catch (Exception e) {

                        e.printStackTrace();
                    }

                }

            });
    try {
        Bundle permission_param = new Bundle();
        permission_param.putString("fields", "id,name,email,picture.width(120).height(120)");
        data_request.setParameters(permission_param);
        data_request.executeAsync();

    } catch (Exception e) {
        e.printStackTrace();
    }

}

protected void onResume() {
    super.onResume();
    // Logs 'install' and 'app activate' App Events.
    AppEventsLogger.activateApp(this);
}

@Override
protected void onPause() {
    super.onPause();
    // Logs 'app deactivate' App Event.
    AppEventsLogger.deactivateApp(this);
}


@Override
protected void onDestroy() {
    super.onDestroy();
    //LoginManager.getInstance().logOut();
}

}

标签: androidfacebookonactivityresult

解决方案


最后我得到了解决方案,我从头开始使用另一个 Activity 并慢慢复制新的 Activity 直到它与正在破坏的那个匹配。简而言之,它与 Activity 无关,而与 Android Manifest 无关。

在我的 Android 清单中,我的 LoginActivity 上有 android:noHistory="true" 导致我的应用程序崩溃。一旦我删除它,它就会再次起作用。

<activity
            android:name=".Activity.General.LoginActivity"
            android:noHistory="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

推荐阅读