2013-04-10 308 views
4

嗨,我需要實現我的Android應用程序的Facebook登錄。我也使用andengine,所以我不能使用facebook提供的登錄按鈕。 我還需要用戶的電子郵件地址。Facebook登錄android

我爲此創建了一個名爲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()內爲空。 但我的應用程序實際上去Facebook授權我並要求權限。 我錯過了什麼嗎? 傢伙請

+0

您使用的SDK版本3.0.1,而不是3.0?他們有3.0 – IncrediApp 2013-04-10 16:09:16

+0

中的錯誤,我只使用3.0.1我驗證過。 @IncrediApp – 2013-04-10 16:32:41

+2

我知道它的工作。這些問題很好地解釋在 http://stackoverflow.com/questions/13897056/when-to-request-permissions-with-facebooks-new-android-sdk-3-0 – 2013-04-11 01:50:08

回答

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); 
    } 
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); 
    } 

} 

}

+0

//打電話給類 CallbackManger mCallbackManager = CallbackManager.Factory.create(); 新的FacebookLoginManager(this,fragment).initializedFacebook(mCallbackManager); //依賴要使用 編譯 'com.facebook.android:facebook-android-sdk:4.25.0' 不要忘記處理上的活動結果 mCallbackManager.onActivityResult(requestCode,resultCode爲,數據); – Amardeep 2017-12-21 11:47:35

0

可以爲facebook登錄創建Helper類:

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()); 
    } 
}