Facebook登录安卓

4

我需要为我的Android应用实现Facebook登录。我正在使用AndEngine,因此无法使用Facebook提供的登录按钮。我还需要获取用户的电子邮件地址。

为此目的,我已创建了一个名为facebookActivity的活动:

public class FacebookActivity extends BaseGameActivity{
    private static final int CAMERA_WIDTH = 480;
    private static final int CAMERA_HEIGHT = 720;
    private Scene scene;
    private StatusCallback callback;
    
    

    
    @SuppressLint("NewApi")
    @Override
    public EngineOptions onCreateEngineOptions() {
        int SDK_INT = android.os.Build.VERSION.SDK_INT;

        if (SDK_INT>8){

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

        StrictMode.setThreadPolicy(policy); 

        }
        final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
        return new EngineOptions(true, ScreenOrientation.PORTRAIT_SENSOR, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);
    
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
    }
    @Override
    public void onCreateResources(
            OnCreateResourcesCallback pOnCreateResourcesCallback)
            throws Exception {
        pOnCreateResourcesCallback.onCreateResourcesFinished();
        // TODO Auto-generated method stub
        
    }

    @Override
    public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback)
            throws Exception {
        scene = new Scene();
        scene.setBackground(new Background(HelperMethods.getColorFromHex("#372108")));
        
        pOnCreateSceneCallback.onCreateSceneFinished(scene);
        
    }

    @Override
    public void onPopulateScene(Scene pScene,
            OnPopulateSceneCallback pOnPopulateSceneCallback) throws Exception {
        callback = new Session.StatusCallback() {

              // callback when session changes state
              @Override
              public void call(Session session, SessionState state, Exception exception) {
                if (session.isOpened()) {

                  // make request to the /me API
                  Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

                    // callback after Graph API response with user object
                    @Override
                    public void onCompleted(GraphUser user, Response response) {
                      if (user != null) {
                        Log.d("text","Hello " + user.getName() + " " + user.getInnerJSONObject());
                        
                      }
                    }
                  });
         
                }
                else{
                    
                }
              }
            };
            final OpenRequest openRequest = new OpenRequest(this);
              List<String> readPermissions = new ArrayList<String>();
              readPermissions.add("email");
              openRequest.setPermissions(readPermissions);
              openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);
              openRequest.setCallback(callback);
        runOnUiThread(new Runnable(){

            @Override
            public void run() {
                
                 new Session(FacebookActivity.this).openForRead(openRequest);
                
            }
            
        });
        pOnPopulateSceneCallback.onPopulateSceneFinished();     
    }

}

当我运行这段代码时,会出现一个异常NullPointerException:
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=64206, result=-1, data=Intent { (has extras) }} to activity {com.vocabtrainer.code/com.vocabtrainer.code.FacebookActivity}: java.lang.NullPointerException

我尝试调试并发现在onActivityResult中,Session.getActiveSession()为null,但是我的应用程序实际上已经进入了Facebook授权界面并请求了权限。

我是否漏掉了什么东西?


你正在使用 SDK 版本 3.0.1 而不是 3.0 吗?他们在 3.0 版本中恰好有那个 bug。 - IncrediApp
我只使用了3.0.1版本,已经验证过了。@IncrediApp - Geo Paul
2
我搞定了。这些问题在以下链接中有很好的解释:https://dev59.com/vGYr5IYBdhLWcg3wLXOh - Geo Paul
3个回答

0
private Context context;
private Fragment mFragment;
private ShareDialog mShareDialog;

/**
 * @param context
 */
public FacebookLoginManager(Context context, Fragment fragment) {
    this.context = context;
    this.mFragment = fragment;
}

/**
 * @param context
 */
public FacebookLoginManager(Context context) {
    this.context = context;
}

/**
 * The purpose of this method is to initialize the facebook sdk
 *
 * @param callbackManager
 */
public void initializedFacebook(CallbackManager callbackManager) {
    if (FacebookSdk.isInitialized()) {
        performFacebookLogin(callbackManager);
    } else {
        FacebookSdk.sdkInitialize(getApplicationContext());
        performFacebookLogin(callbackManager);
    }
}

/**
 * The purpose of this method is to initialize the facebook  data from the server
 *
 * @param callbackManager
 */
private void performFacebookLogin(CallbackManager callbackManager) {
    try {
        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        final String accessToken = "" + loginResult.getAccessToken().getToken();
                        Log.e("accessToken", accessToken);

                        GraphRequest request = GraphRequest.newMeRequest(
                                AccessToken.getCurrentAccessToken(),
                                new GraphRequest.GraphJSONObjectCallback() {
                                    @Override
                                    public void onCompleted(
                                            JSONObject object,
                                            GraphResponse response) {
                                        try {
                                            final FacebookResponseBean mFacebookResponseBean = new FacebookResponseBean();
                                            if (object != null) {
                                                if (object.has(FacebookConstants.ID) && object.get(FacebookConstants.ID) != null) {
                                                    mFacebookResponseBean.setUserId(object.get(FacebookConstants.ID) + "");
                                                }
                                                if (object.has(FacebookConstants.NAME) && object.get(FacebookConstants.NAME) != null) {
                                                    mFacebookResponseBean.setName(object.get(FacebookConstants.NAME) + "");
                                                }
                                                if (object.has(FacebookConstants.EMAIL) && object.get(FacebookConstants.EMAIL) != null) {
                                                    mFacebookResponseBean.setEmail(object.get(FacebookConstants.EMAIL) + "");
                                                }
                                                if (object.has(FacebookConstants.GENDER) && object.get(FacebookConstants.GENDER) != null) {
                                                    mFacebookResponseBean.setGender(object.get(FacebookConstants.GENDER) + "");
                                                }
                                                if (object.has(FacebookConstants.BIRTHDAY) && object.get(FacebookConstants.BIRTHDAY) != null) {
                                                    mFacebookResponseBean.setBirthday(object.get(FacebookConstants.BIRTHDAY) + "");
                                                }
                                                if (object.has(FacebookConstants.AGE_RANGE) && object.get(FacebookConstants.AGE_RANGE) != null) {
                                                    mFacebookResponseBean.setAgerange(object.get(FacebookConstants.AGE_RANGE) + "");
                                                }
                                                if (object.has(FacebookConstants.TIMEZONE) && object.get(FacebookConstants.TIMEZONE) != null) {
                                                    mFacebookResponseBean.setTimezone(object.get(FacebookConstants.TIMEZONE) + "");
                                                }
                                                if (object.has(FacebookConstants.VERIFIED) && object.get(FacebookConstants.VERIFIED) != null) {
                                                    mFacebookResponseBean.setVerified(object.get(FacebookConstants.VERIFIED) + "");
                                                }
                                                if (object.has(FacebookConstants.UPDATED_TIME) && object.get(FacebookConstants.UPDATED_TIME) != null) {
                                                    mFacebookResponseBean.setUpdatedtime(object.get(FacebookConstants.UPDATED_TIME) + "");
                                                }
                                                if (object.has(FacebookConstants.LOCALE) && object.get(FacebookConstants.LOCALE) != null) {
                                                    mFacebookResponseBean.setLocale(object.get(FacebookConstants.LOCALE) + "");
                                                }
                                                if (object.has(FacebookConstants.FIRST_NAME) && object.get(FacebookConstants.FIRST_NAME) != null) {
                                                    mFacebookResponseBean.setFirstName(object.get(FacebookConstants.FIRST_NAME) + "");
                                                }
                                                if (object.has(FacebookConstants.LAST_NAME) && object.get(FacebookConstants.LAST_NAME) != null) {
                                                    mFacebookResponseBean.setLastName(object.get(FacebookConstants.LAST_NAME) + "");
                                                }
                                                if (object.has(FacebookConstants.PICTURE) && object.get(FacebookConstants.PICTURE) != null) {
                                                    JSONObject picture = object.getJSONObject(FacebookConstants.PICTURE);
                                                    JSONObject data = picture.getJSONObject("data");
                                                    if (data.has("url") && data.get("url") != null) {
                                                        mFacebookResponseBean.setPhotolink(data.get("url") + "");
                                                        Logger.error("image", data.get("url") + "");
                                                    }

                                                }
                                            }
                                            if (context instanceof LoginActivity) {
                                                ((LoginActivity) context).setFaceBookResponse(mFacebookResponseBean);
                                            } else if (context instanceof RegistrationActivity) {
                                                ((RegistrationActivity) context).setFaceBookResponse(mFacebookResponseBean);
                                            } else if (context instanceof UserProfileActivity) {
                                                ((UserProfileActivity) context).setFaceBookResponse(mFacebookResponseBean);
                                            } else if (mFragment != null && mFragment instanceof FragmentLinkAccounts) {
                                                ((FragmentLinkAccounts) mFragment).setFaceBookResponse(mFacebookResponseBean);

                                            }
                                        } catch (JSONException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                });
                        Bundle parameters = new Bundle();
                        parameters.putString("fields", FacebookConstants.PERMISSION);
                        request.setParameters(parameters);
                        request.executeAsync();
                    }

                    @Override
                    public void onCancel() {
                    }

                    @Override
                    public void onError(FacebookException exception) {
                        exception.printStackTrace();
                        if (exception instanceof FacebookAuthorizationException) {
                            if (AccessToken.getCurrentAccessToken() != null) {
                                LoginManager.getInstance().logOut();
                            }
                        }
                    }
                });
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * The purpose of this method is to share the image and content on facebook
 *
 * @param activity
 * @param manager
 * @param image
 * @param isShareRequest
 * @param id
 */
public void shareContent(final Activity activity, CallbackManager manager, View image, final boolean isShareRequest, int id) {
    mShareDialog = new ShareDialog(activity);
    String time = GlobalAcess.getDateTime();
    mShareDialog.registerCallback(manager, new FacebookCallback<Sharer.Result>() {
        @Override
        public void onSuccess(Sharer.Result result) {
            if (isShareRequest)
                ToastMessage.getInstance(activity).showLongMessage(activity.getString(R.string.msg_request_posted));
            else
                ToastMessage.getInstance(activity).showLongMessage(activity.getString(R.string.msg_trip_posted));

        }

        @Override
        public void onCancel() {
        }

        @Override
        public void onError(FacebookException error) {
            error.printStackTrace();

        }
    });
    String url = "";
    if (isShareRequest) {
        url = NetworkConstants.SHARE_REQUEST_URL + "id=" + id + "?t=" + time;
    } else {
        url = NetworkConstants.SHARE_TRIP_URL + "id=" + id + "?t=" + time;
    }
    if (ShareDialog.canShow(ShareLinkContent.class)) {
        ShareLinkContent content = new ShareLinkContent.Builder()
                .setContentUrl(Uri.parse(url))
                .build();
        mShareDialog.show(content);
    }

}

}


//调用类 CallbackManger mCallbackManager = CallbackManager.Factory.create(); new FacebookLoginManager(this, fragment).initializedFacebook(mCallbackManager);//使用的依赖项 compile 'com.facebook.android:facebook-android-sdk:4.25.0'不要忘记处理活动结果 mCallbackManager.onActivityResult(requestCode, resultCode, data); - Amardeep

0
你可以创建一个 Helper 类来实现 Facebook 登录:
public class FbSignInHelper implements FacebookCallback<LoginResult>,
        GraphRequest.GraphJSONObjectCallback {

    private final LoginManager loginManager;
    private FbSignInCompletionListener fbSignInCompletionListener;
    private final Fragment fragment;
    private String accessToken;
    private PrefManager prefManager = PrefManager.getInstance();

    public FbSignInHelper(@NonNull LoginManager loginManager,
                          @NonNull CallbackManager callbackManager, Fragment fragment) {
        this.loginManager = loginManager;
        this.fragment = fragment;

        loginManager.registerCallback(callbackManager, this);
    }

    public void loginUsingFb(FbSignInCompletionListener fbSignInCompletionListener) {
        this.fbSignInCompletionListener = fbSignInCompletionListener;
        loginManager.logInWithReadPermissions(fragment, Arrays.asList("public_profile", "email"));
    }

    @Override
    public void onSuccess(LoginResult loginResult) {

        loginResult.getAccessToken();

        accessToken = loginResult.getAccessToken().getToken();

        if (loginResult.getRecentlyDeniedPermissions().contains("email")) {
            fbSignInCompletionListener.onFbPermissionDenied();
            return;
        }
        GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), this);
        Bundle parameters = new Bundle();
        parameters.putString("fields", "name,picture,email,first_name,last_name");
        request.setParameters(parameters);
        request.executeAsync();
    }

    @Override
    public void onCancel() {

        fbSignInCompletionListener.onFbSignInError(R.string.error_msg_fb_error);
    }

    @Override
    public void onError(FacebookException error) {
        if (error instanceof FacebookAuthorizationException) {
            if (AccessToken.getCurrentAccessToken() != null) {
                LoginManager.getInstance().logOut();
            }
        }
        fbSignInCompletionListener.onFbSignInError(R.string.error_msg_fb_error);
    }

    @Override
    public void onCompleted(JSONObject object, GraphResponse response) {

        FacebookRequestError error = response.getError();

        if (error != null) {

            fbSignInCompletionListener.onFbSignInError(R.string.error_msg_fb_error);
            return;
        }

        if (!object.has("email")) {
            fbSignInCompletionListener.emailEmpty(accessToken, object.optString("id"));
            final String first_name = object.optString("first_name");
            final String last_name = object.optString("last_name");

            return;
        }

        if (!object.has("email") || !object.has("id")) {

            fbSignInCompletionListener.onFbSignInError(R.string.error_msg_fb_error);
            return;
        }

        try {
            final String email = object.getString("email");
            final String profilePhoto = object.getJSONObject("picture").
                    getJSONObject("data").optString("url");
            final String name = object.optString("name");
            final String first_name = object.optString("first_name");
            final String last_name = object.optString("last_name");
            final String id = object.optString("id");

            prefManager.setUserName(first_name + " " + last_name);
            FacebookUser facebookUser = new FacebookUser(first_name, last_name, email, profilePhoto, id, accessToken);
            fbSignInCompletionListener.onFbSignInSuccess(facebookUser);


        } catch (JSONException e) {
            Log.e("exception", "unable to parse response from facebook with error message ->%s" + e.getMessage());
            //report error to the presenter
            fbSignInCompletionListener.onFbSignInError(R.string.error_msg_fb_error);
        }
        //
        Log.d("response ->%s", response.getRawResponse());
    }
}

0
    protected void onFacebookLoginClicked() {
            Session.openActiveSession(SplashActivity.this, true, permissions,
                    new Session.StatusCallback() {
                        @Override
                        public void call(Session session, SessionState state,
                                Exception exception) {
                            if (session.isOpened()) {
                                Request.newMeRequest(session,
                                        new Request.GraphUserCallback() {
                                            @Override
                                            public void onCompleted(GraphUser user,
                                                    com.facebook.Response response) {
                                                if (user != null) {
                                                    final Session curSession = Session
                                                            .getActiveSession();
                                                    fbUserid = user.getId();
                                                    fbEmail = user.asMap()
                                                            .get("email")
                                                            .toString();
                                                    fbtoken = curSession
                                                            .getAccessToken();
                                                    fbFirstName = user
                                                            .getFirstName();
                                                    fbLastName = user.getLastName();
                                                    fbLink = "https://graph.facebook.com/"
                                                            + fbUserid + "/picture";


        enter code here
                                                }
                                            }
                                        }).executeAsync();
                            }
                        }



                });
    }
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Session.getActiveSession().onActivityResult(this, requestCode,
                resultCode, data);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接