Android Facebook api 3.0 error: Cannot call LoginActivity with a null calling package

后端 未结 4 1093
轮回少年
轮回少年 2020-12-01 12:26

I am trying to integrate an android app with the the new facebook 3.0 api, but I get this exception:

java.lang.RuntimeException: Unable to resume acti

4条回答
  •  孤街浪徒
    2020-12-01 13:21

    I've got the same problem : trying to log into facebook, with the dialog provided inside the SDK, but from an activity that was itself inside a tabgroup ; like ShareActivity above.

    What I've done is basically called startActivityForResult on parent activity of ShareActivity (that is ShareGroupActivity), instead of calling it on ShareActivity.

    So 1 , add this in ShareGroupActivity :

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        System.out.println("facebook status called");
        super.onActivityResult(requestCode, resultCode, data);
        Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
    }
    

    2 you need to modify the class Session, inside FacebookSDK project, under src com.facebook

    2.1 add a boolean member

    public boolean insideTabGroup;
    

    2.2 modify StartActivityDelegate, that is used by session to open login ; add the boolean as parameter

    interface StartActivityDelegate {
        public void startActivityForResult(Intent intent, int requestCode, boolean insideTabGroup);
    
        public Activity getActivityContext();
    }
    

    2.3 inside the inner class AuthorizationRequest, modify the implementation of this delegate :

        AuthorizationRequest(final Activity activity) {
            startActivityDelegate = new StartActivityDelegate() {
                @Override
                public void startActivityForResult(Intent intent, int requestCode, boolean insideTabGroup) {
                    if(insideTabGroup) {
                        ActivityGroup parentActivity = (ActivityGroup) activity.getParent();
                        parentActivity.startActivityForResult(intent,requestCode);
    
                    } else {
                        activity.startActivityForResult(intent, requestCode);
                    }
                }
    
                @Override
                public Activity getActivityContext() {
                    return activity;
                }
            };
        }
    

    2.4 Also, modify the other constructors of AuthorizationRequest, by just adding the boolean parameter. As I do not use login to facebook from somewhere else than an activity, that's ok.

    2.5 Modifiy the tryLoginActivity method of Session class, to use the boolean member as a parameter :

    private boolean tryLoginActivity(AuthorizationRequest request) {
        Intent intent = getLoginActivityIntent(request);
    
        if (!resolveIntent(intent)) {
            return false;
        }
    
        try {
            request.getStartActivityDelegate().startActivityForResult(intent, request.getRequestCode(),this.insideTabGroup);
    
        } catch (ActivityNotFoundException e) {
            return false;
        }
    
        return true;
    }
    

    3 Set the boolean member in the session :

    Session session = Session.getActiveSession();
    session.insideTabGroup = true;
    

    That should do the trick.

    Cdt

提交回复
热议问题