2016-03-23 36 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

是的這是正確的,但我需要一個對話框來阻止線程。因爲用戶登錄,然後他離開活動。該過程在用戶離開活動之前沒有機會下載圖片。我需要在他離開活動之前收集姓名和個人資料圖片。 –