2017-06-25 3 views
3

私は、新しくリリースされたFirebase Phone認証を自分のアプリケーションで実装する作業を進めています。問題は、アンドロイドスタジオを介してデバッグするとき、私はSMS OTPを受け取ることです。しかし、私がリリースアプリケーションをインストールすると、OTPは届きません。デバッグ中に働いていたすべてのデバイスで起こっています。ここでは携帯電話の認証活動のためのコードですFirebase PhoneAuthenticationはデバッグビルドでは動作しますが、リリースビルドでは動作しません

package com.icucs.ip; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.text.TextUtils; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

import com.google.android.gms.tasks.OnCompleteListener; 
import com.google.android.gms.tasks.Task; 
import com.google.firebase.FirebaseException; 
import com.google.firebase.FirebaseTooManyRequestsException; 
import com.google.firebase.auth.AuthResult; 
import com.google.firebase.auth.FirebaseAuth; 
import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException; 
import com.google.firebase.auth.FirebaseUser; 
import com.google.firebase.auth.PhoneAuthCredential; 
import com.google.firebase.auth.PhoneAuthProvider; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 

import java.util.concurrent.TimeUnit; 

public class PhoneAuth extends AppCompatActivity implements View.OnClickListener { 

    private PhoneAuthProvider.ForceResendingToken mResendToken; 
    private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks; 
    private boolean mVerificationInProgress = false; 
    private String mVerificationId; 
    private static final int STATE_INITIALIZED = 1; 
    private static final int STATE_CODE_SENT = 2; 
    private static final int STATE_VERIFY_FAILED = 3; 
    private static final int STATE_VERIFY_SUCCESS = 4; 
    private static final int STATE_SIGNIN_FAILED = 5; 
    private static final int STATE_SIGNIN_SUCCESS = 6; 
    private Button mStartButton; 
    private Button mVerifyButton; 
    private Button mResendButton; 
    private FirebaseAuth mAuth; 
    private EditText mPhoneNumberField; 
    private EditText mVerificationField; 
    private FirebaseAuth.AuthStateListener mAuthListener; 
    private static final String TAG = "PhoneAuthActivity"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_phone_auth); 
     mAuth = FirebaseAuth.getInstance(); 
     DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("Users"); 

     mAuth = FirebaseAuth.getInstance(); 
     mAuthListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 

       if (firebaseAuth.getCurrentUser() != null) { 
        startActivity(new Intent(PhoneAuth.this, MainActivity.class)); 
       } 
      } 
     }; 

     mStartButton = (Button) findViewById(R.id.button_start_verification); 
     mVerifyButton = (Button) findViewById(R.id.button_verify_phone); 
     mResendButton = (Button) findViewById(R.id.button_resend); 
     mPhoneNumberField = (EditText) findViewById(R.id.field_phone_number); 
     mVerificationField = (EditText) findViewById(R.id.field_verification_code); 

     mStartButton.setOnClickListener(this); 
     mVerifyButton.setOnClickListener(this); 
     mResendButton.setOnClickListener(this); 

     //Phone Authentication 
     mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() { 

      @Override 
      public void onVerificationCompleted(PhoneAuthCredential credential) { 
       // This callback will be invoked in two situations: 
       // 1 - Instant verification. In some cases the phone number can be instantly 
       //  verified without needing to send or enter a verification code. 
       // 2 - Auto-retrieval. On some devices Google Play services can automatically 
       //  detect the incoming verification SMS and perform verificaiton without 
       //  user action. 
       Log.d(TAG, "onVerificationCompleted:" + credential); 
       // [START_EXCLUDE silent] 
       mVerificationInProgress = false; 
       // [END_EXCLUDE] 

       // [START_EXCLUDE silent] 
       // Update the UI and attempt sign in with the phone credential 
       updateUI(STATE_VERIFY_SUCCESS, credential); 
       // [END_EXCLUDE] 
       signInWithPhoneAuthCredential(credential); 
      } 

      @Override 
      public void onVerificationFailed(FirebaseException e) { 
       // This callback is invoked in an invalid request for verification is made, 
       // for instance if the the phone number format is not valid. 
       Log.w(TAG, "onVerificationFailed", e); 
       // [START_EXCLUDE silent] 
       mVerificationInProgress = false; 
       // [END_EXCLUDE] 

       if (e instanceof FirebaseAuthInvalidCredentialsException) { 
        // Invalid request 
        // [START_EXCLUDE] 
        mPhoneNumberField.setError("Invalid phone number"); 
        // [END_EXCLUDE] 
       } else if (e instanceof FirebaseTooManyRequestsException) { 
        // The SMS quota for the project has been exceeded 
        // [START_EXCLUDE] 
        Snackbar.make(findViewById(android.R.id.content), "Quota exceeded.", 
          Snackbar.LENGTH_SHORT).show(); 
        // [END_EXCLUDE] 
       } 

       // Show a message and update the UI 
       updateUI(STATE_VERIFY_FAILED); 
       // [START_EXCLUDE] 
       // [END_EXCLUDE] 
      } 

      @Override 
      public void onCodeSent(String verificationId, 
            PhoneAuthProvider.ForceResendingToken token) { 
       // The SMS verification code has been sent to the provided phone number, we 
       // now need to ask the user to enter the code and then construct a credential 
       // by combining the code with a verification ID. 
       Log.d(TAG, "onCodeSent:" + verificationId); 

       // Save verification ID and resending token so we can use them later 
       mVerificationId = verificationId; 
       mResendToken = token; 

       // [START_EXCLUDE] 
       // Update UI 
       updateUI(STATE_CODE_SENT); 
       // [END_EXCLUDE] 
      } 
     }; 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     mAuth.addAuthStateListener(mAuthListener); 
     if (mVerificationInProgress && validatePhoneNumber()) { 
      startPhoneNumberVerification(mPhoneNumberField.getText().toString()); 
     } 
    } 

    private void startPhoneNumberVerification(String phoneNumber) { 
     // [START start_phone_auth] 
     PhoneAuthProvider.getInstance().verifyPhoneNumber(
       phoneNumber,  // Phone number to verify 
       120,     // Timeout duration 
       TimeUnit.SECONDS, // Unit of timeout 
       this,    // Activity (for callback binding) 
       mCallbacks);  // OnVerificationStateChangedCallbacks 
     // [END start_phone_auth] 

     mVerificationInProgress = true; 
    } 

    private void verifyPhoneNumberWithCode(String verificationId, String code) { 
     // [START verify_with_code] 
     PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code); 
     // [END verify_with_code] 
     signInWithPhoneAuthCredential(credential); 
    } 

    // [START resend_verification] 
    private void resendVerificationCode(String phoneNumber, 
             PhoneAuthProvider.ForceResendingToken token) { 
     PhoneAuthProvider.getInstance().verifyPhoneNumber(
       phoneNumber,  // Phone number to verify 
       60,     // Timeout duration 
       TimeUnit.SECONDS, // Unit of timeout 
       this,    // Activity (for callback binding) 
       mCallbacks,   // OnVerificationStateChangedCallbacks 
       token);    // ForceResendingToken from callbacks 
    } 
    // [END resend_verification] 

    // [START sign_in_with_phone] 
    private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) { 
     mAuth.signInWithCredential(credential) 
       .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> task) { 
         if (task.isSuccessful()) { 
          // Sign in success, update UI with the signed-in user's information 
          Log.d(TAG, "signInWithCredential:success"); 

          FirebaseUser user = task.getResult().getUser(); 
          // [START_EXCLUDE] 
          updateUI(STATE_SIGNIN_SUCCESS, user); 
          // [END_EXCLUDE] 
         } else { 
          // Sign in failed, display a message and update the UI 
          Log.w(TAG, "signInWithCredential:failure", task.getException()); 
          if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) { 
           // The verification code entered was invalid 
           // [START_EXCLUDE silent] 
           mVerificationField.setError("Invalid code."); 
           // [END_EXCLUDE] 
          } 
          // [START_EXCLUDE silent] 
          // Update UI 
          updateUI(STATE_SIGNIN_FAILED); 
          // [END_EXCLUDE] 
         } 
        } 
       }); 
    } 

    private boolean validatePhoneNumber() { 
     String phoneNumber = mPhoneNumberField.getText().toString(); 
     if (TextUtils.isEmpty(phoneNumber) || phoneNumber.length() > 10 || phoneNumber.length() < 10) { 
      Toast.makeText(this,"Enter valid phone number",Toast.LENGTH_SHORT).show(); 
      mPhoneNumberField.setError("Invalid phone number."); 
      return false; 
     } 

     return true; 
    } 

    private void updateUI(int uiState) { 
     updateUI(uiState, mAuth.getCurrentUser(), null); 
    } 

    private void updateUI(FirebaseUser user) { 
     if (user != null) { 
      updateUI(STATE_SIGNIN_SUCCESS, user); 
     } else { 
      updateUI(STATE_INITIALIZED); 
     } 
    } 

    private void updateUI(int uiState, FirebaseUser user) { 
     updateUI(uiState, user, null); 
    } 

    private void updateUI(int uiState, PhoneAuthCredential cred) { 
     updateUI(uiState, null, cred); 
    } 

    private void updateUI(int uiState, FirebaseUser user, PhoneAuthCredential cred) { 
     switch (uiState) { 
      case STATE_INITIALIZED: 
       // Initialized state, show only the phone number field and start button 
       enableViews(mStartButton, mPhoneNumberField); 
       disableViews(mVerifyButton, mResendButton, mVerificationField); 
       break; 
      case STATE_CODE_SENT: 
       // Code sent state, show the verification field, the 
       enableViews(mVerifyButton, mResendButton, mPhoneNumberField, mVerificationField); 
       disableViews(mStartButton); 
       break; 
      case STATE_VERIFY_FAILED: 
       // Verification has failed, show all options 
       enableViews(mStartButton, mVerifyButton, mResendButton, mPhoneNumberField, 
         mVerificationField); 
       break; 
      case STATE_VERIFY_SUCCESS: 
       // Verification has succeeded, proceed to firebase sign in 
       disableViews(mStartButton, mVerifyButton, mResendButton, mPhoneNumberField, 
         mVerificationField); 

       // Set the verification text based on the credential 
       if (cred != null) { 
        if (cred.getSmsCode() != null) { 
         mVerificationField.setText(cred.getSmsCode()); 
        } else { 
         mVerificationField.setText(R.string.instant_validation); 
        } 
       } 

       break; 
      case STATE_SIGNIN_FAILED: 
       Toast.makeText(this,"Sign In failed\nTry Again",Toast.LENGTH_LONG).show(); 
       break; 
      case STATE_SIGNIN_SUCCESS: 
       startActivity(new Intent(PhoneAuth.this,MainActivity.class)); 
       break; 
     } 

     if (user == null) { 
      //Signout options 
     } else { 
      //Signed in 
     } 
    } 

    private void enableViews(View... views) { 
     for (View v : views) { 
      v.setEnabled(true); 
     } 
    } 

    private void disableViews(View... views) { 
     for (View v : views) { 
      v.setEnabled(false); 
     } 
    } 

    @Override 
    public void onClick(View view) { 
     switch (view.getId()) { 
      case R.id.button_start_verification: 
       if (!validatePhoneNumber()) { 
        return; 
       } 

       startPhoneNumberVerification(mPhoneNumberField.getText().toString()); 
       break; 
      case R.id.button_verify_phone: 
       String code = mVerificationField.getText().toString(); 
       if (TextUtils.isEmpty(code)) { 
        mVerificationField.setError("Cannot be empty."); 
        return; 
       } 

       verifyPhoneNumberWithCode(mVerificationId, code); 
       break; 
      case R.id.button_resend: 
       resendVerificationCode(mPhoneNumberField.getText().toString(), mResendToken); 
       Log.d("Chekc","asd"); 
       break; 

     } 
    } 
} 
+1

リリースAPKのSHA-1をそのプロジェクトのFirebaseコンソールに追加しましたか? –

答えて

1

Googleがサービス再生、特定の(例えば電話認証などを、Googleの中-SIGNおよびアプリケーションは招待)ので、私たちが作成することができ、あなたの署名証明書のSHA-1を提供する必要がのOAuth2あなたのアプリのクライアントとAPIキーSHA-1を入手するには、次の手順に従います。 端末を開き、Java付属のkeytoolユーティリティを実行して、証明書のSHA-1フィンガープリントを取得します。リリース証明書とデバッグ証明書の両方のフィンガープリントを取得する必要があります。 リリース証明書のフィンガープリントを取得するには:

keytool -exportcert -list -v \ 
-alias <your-key-name> -keystore <path-to-production-keystore> 

もFirebaseコンソールに

を、アプリケーションのSHA-1ハッシュを設定し、電話番号のサインインが物理デバイスを必要とし、AN上では動作しませんのでご注意エミュレータ。

関連する問題