2016-03-23 33 views
0

我需要在用户登录后收集用户名和个人资料图片。我需要在登录过程中这样做,我试图在FacebookCallback<LoginResult>onSuccess Methode中尝试,但它失败。Facebook图形登录onSuccess执行中,然后等待

我的代码:

btnFbLogin.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 


     @Override 
     public void onSuccess(LoginResult loginResult) { 
      final String userId = loginResult.getAccessToken().getUserId(); 
      final String authToken = loginResult.getAccessToken().getToken(); 

      // Facebook Name, Profile Picture 
      /*GraphRequest request = GraphRequest.newMeRequest(
        loginResult.getAccessToken(), 
        new GraphRequest.GraphJSONObjectCallback() { 
         @Override 
         public void onCompleted(
           JSONObject object, 
           GraphResponse response) { 

          try { 
           userName = object.getString("name"); 
           String url = object.getString("picture"); 

           URL facebookProfileURL = new URL(url); 
           Bitmap profPict = BitmapFactory.decodeStream(facebookProfileURL.openConnection().getInputStream()); 
           ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
           profPict.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
           byte[] b = baos.toByteArray(); 

           profilePicAsString = Base64.encodeToString(b, Base64.DEFAULT); 

           facebookAuthObject.setUserId(userId); 
           facebookAuthObject.setAuthToken(authToken); 
           facebookAuthObject.setName(userName); 
           facebookAuthObject.setProfilePictureAsString(profilePicAsString); 
          } catch (JSONException | IOException e) { 
           e.printStackTrace(); 
          } 
         } 
        }); 
      Bundle parameters = new Bundle(); 
      parameters.putString("fields", "name, picture.width(150).height(150)"); 
      request.setParameters(parameters); 
      request.executeAsync();*/ 


     } 

     @Override 
     public void onCancel() { 
      Log.i(TAG, "User cancel"); 
     } 

     @Override 
     public void onError(FacebookException e) { 
      Log.e(TAG, e.getLocalizedMessage()); 
     } 
    }); 

} 

我需要的东西像executeAndWait但这是不可能的,因为我在主线程上。

有了这个我有问题,如果用户离开活动太快,我什么也没有,因为异步。

有没有人知道我可以如何阻止ui线程?或其他解决方案收集名称和个人资料图片?

感谢的提前

回答

0

通过这个你可以从Facebook的细节

FacebookSdk.sdkInitialize(this.getApplicationContext());

 callbackManager = CallbackManager.Factory.create(); 

     accessTokenTracker = new AccessTokenTracker() { 
      @Override 
      protected void onCurrentAccessTokenChanged(
        AccessToken oldAccessToken, 
        AccessToken currentAccessToken) { 
      } 
     }; 
     accessToken = AccessToken.getCurrentAccessToken(); 

     final LoginManager loginManager = LoginManager.getInstance(); 

     loginManager.registerCallback(callbackManager, 
       new FacebookCallback<LoginResult>() { 
        @Override 
        public void onSuccess(LoginResult loginResult) { 
         GraphRequest request = GraphRequest.newMeRequest(
           loginResult.getAccessToken(), 
           new GraphRequest.GraphJSONObjectCallback() { 

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

             Log.v(TAG, "facebook login response: " + object.toString()); 
             try { 
              email=object.getString("email"); 


              loginManager.logOut(); 
              startActivity(new Intent(LoginActivity.this, MudraMainActivity.class)); 
              finish(); 

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


            } 
           }); 

         Bundle parameters = new Bundle(); 
         parameters.putString("fields", "email,name"); 
         request.setParameters(parameters); 
         request.executeAsync(); 
        } 

        @Override 
        public void onCancel() { 
        } 

        @Override 
        public void onError(FacebookException exception) { 
        } 
       }); 

     loginManager.logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends", "email")); 
+0

这并不能解决问题。和我的代码一样,如果用户快速离开活动,我没有用户数据。 –

+0

只有在onSuccess()方法中,您才会获得数据。如果用户离开该进程将无法完成从Facebook获取数据。 –

+0

是的这是正确的,但我需要一个对话框来阻止线程。因为用户登录,然后他离开活动。该过程在用户离开活动之前没有机会下载图片。我需要在他离开活动之前收集姓名和个人资料图片。 –