2016-03-10 169 views
2

为什么Android Digits在验证号码后不会总是返回onSuccess或onFalure?它只是完成DigitsActivity并且什么都不做,但有时它可以,我会收到onSuccess。Android Digits不会返回任何内容

public void initForm(){ 
    Digits.getSessionManager().clearActiveSession();// http://stackoverflow.com/questions/31679089/fabric-digits-returns-a-null-object-of-phonenumber-after-otp-verification-on-and 
    DigitsAuthConfig.Builder digitsAuthConfigBuilder = new DigitsAuthConfig.Builder() 
      .withAuthCallBack(new AuthCallback() { 
       @Override 
       public void success(DigitsSession digitsSession, String s) { 
        Toast.makeText(LoginActivity.this, s, Toast.LENGTH_LONG).show(); 
        TwitterAuthToken token = (TwitterAuthToken)digitsSession.getAuthToken(); 
        DigitsOAuthSigning oauthSigning = new DigitsOAuthSigning(SapronApplication.conf(), token); 
        Map<String, String> authHeaders = oauthSigning.getOAuthEchoHeadersForVerifyCredentials(); 
        requestToken(authHeaders.get("X-Verify-Credentials-Authorization")); 

       } 

       @Override 
       public void failure(DigitsException e) { 
        Toast.makeText(LoginActivity.this, e.toString(), Toast.LENGTH_LONG).show(); 
       } 
      }) 
      .withPhoneNumber("+7"); 


    Digits.authenticate(digitsAuthConfigBuilder.build()); 
} 

回答

1

我遇到了同样的问题,phoneNumber返回为空,如this question。我在使用自定义按钮时解决了问题。主要的问题是没有正确清除数字会话,并在每次点击时在withAuthCallBack()中设置新的AuthCallback。解决了我的问题的代码如下所示。希望这将帮助别人谁需要使用数字自定义按钮.....

findViewById(R.id.customDigitsButton).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      verifyMobileUsingDigits(); 
     } 
    }); 

private AuthCallback authCallback; 
public void verifyMobileUsingDigits(){ 
    logoutFabricDigits("verifyMobileUsingDigits");// manual deletion of all digit sessions, as only Digits.getSessionManager().clearActiveSession() did not helped me..... 
    if(authCallback == null){ 
     authCallback = new AuthCallback() { 
      @Override 
      public void success(DigitsSession session, String phoneNumber) { 
       Toast.makeText(getApplicationContext(), "Authentication successful for " + phoneNumber, Toast.LENGTH_LONG).show(); 
      } 

      @Override 
      public void failure(DigitsException exception) { 
       Toast.makeText(getApplicationContext(), "Authentication failure", Toast.LENGTH_LONG).show(); 
      } 
     }; 
    } 
    DigitsAuthConfig.Builder digitsAuthConfigBuilder = new DigitsAuthConfig.Builder() 
      .withAuthCallBack(authCallback) 
      .withPhoneNumber("+880") 
      .withEmailCollection(false) 
      .withThemeResId(R.style.CustomDigitsTheme); 
    Digits.authenticate(digitsAuthConfigBuilder.build()); 
} 

public static void logoutFabricDigits(String TAG){ 
    try { 
     Map<Long, DigitsSession> digitsSessionMap = Digits.getSessionManager().getSessionMap(); 
     if(digitsSessionMap != null){ 
      Set<Long> digitIdSet = new HashSet<>(digitsSessionMap.keySet()); 
      for(Long digitId : digitIdSet){ 
       DigitsSession digitsSession = digitsSessionMap.get(digitId); 
       if(digitsSession != null){ 
        Digits.getSessionManager().clearSession(digitsSession.getId()); 
       } 
      } 
     } 
     Digits.getSessionManager().clearActiveSession(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
0

好吧,我不知道自定义按钮和自定义authcallback有什么问题。通过使用DigitsAuthButton解决了问题。

digitsButton = (DigitsAuthButton) findViewById(R.id.auth_button); 
    // digitsButton.setAuthTheme(R.style.AppTheme2); 
    digitsButton.setCallback(new AuthCallback() { 
     @Override 
     public void success(DigitsSession digitsSession, String s) { 
      new MaterialDialog.Builder(LoginActivity.this) 
        .progress(true, 0) 
        .show(); 
      TwitterAuthToken token = (TwitterAuthToken)digitsSession.getAuthToken(); 
      DigitsOAuthSigning oauthSigning = new DigitsOAuthSigning(SapronApplication.conf(), token); 
      Map<String, String> authHeaders = oauthSigning.getOAuthEchoHeadersForVerifyCredentials(); 
      requestToken(authHeaders.get("X-Verify-Credentials-Authorization")); 
     } 

     @Override 
     public void failure(DigitsException e) { 

     } 
    }); 
0

为@rallat这里评论https://github.com/twitter/digits-android/issues/6

他们改变了authcallback成弱引用,以避免内存泄漏。

只是在你的环境中创建回调变量,f.e:

AuthCallback authCallback = new AuthCallback() { 
    @Override 
    public void success(DigitsSession session, String phoneNumber) { 
     // Do something with the session 
     Log.d(TAG, "success: " + phoneNumber); 
    } 

    @Override 
    public void failure(DigitsException exception) { 
     // Do something on failure 
     Log.d(TAG, "failure: "); 
     //show error or somthing 
    } 
}; 

,并把它传递给你的建设者:

digitsButton.setCallback(authCallback);