GoogleチュートリアルやデバッグビルドバリアントのようにSMS Retriever API
を実装しました。私はSMSを読むことができ、ログインを行うことができるユーザーにコードを取得できます。
私の問題は、ビルドバリアントのリリースでアプリを実行すると、SMSが機能しないことです。 SMSを受け取りましたが、ログインするためのコードを読み取ることができません。
AppSignatureHelper で生成されたハッシュを、デバッグモードとは異なるリリースモードで変更します。デバッグ作業およびリリース番号.
いくつかの助けに感謝します
コード:
マニフェスト:
<receiver Android:name=".app.receivers.SmsReceiver">
<intent-filter>
<action Android:name="com.google.Android.gms.auth.api.phone.SMS_RETRIEVED"/>
</intent-filter>
</receiver>
私のクラスでは:(リリースおよびデバッグモードでは、コードはonSucessメソッドをスローします)このメソッドはonCreateで呼び出されます。
private void startSMSListening(){
SmsRetrieverClient client = SmsRetriever.getClient(this);
Task<Void> task = client.startSmsRetriever();
task.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// Successfully started retriever, expect broadcast intent
Log.e("startSMSListening", "listening sms");
sendCode();
showHideLoadingView(false);
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Failed to start retriever, inspect Exception for more details
Log.e("startSMSListening", "failure listening sms");
showHideLoadingView(false);
}
});
}
受信者:
public class SmsReceiver extends BroadcastReceiver {
//interface
private static SmsListener mListener;
@Override
public void onReceive(Context context, Intent intent) {
if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
Bundle extras = intent.getExtras();
if(extras != null) {
Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
if(status != null) {
switch (status.getStatusCode()) {
case CommonStatusCodes.SUCCESS:
// Get SMS message contents
String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
//Pass the message text to interface
if (mListener != null && !StringUtil.isNull(message)) {
mListener.messageReceived(message);
}
break;
case CommonStatusCodes.TIMEOUT:
Log.d("SMSReceiver", "timed out (5 minutes)");
break;
}
}
}
}
}
public static void bindListener(SmsListener listener) {
mListener = listener;
}
}
私のsmsReceiverメソッド:
private void smsReceiver(){
SmsReceiver.bindListener(new SmsListener() {
@Override
public void messageReceived(String messageText) {
//From the received text string you may do string operations to get the required OTP
//It depends on your SMS format
Log.e("Message",messageText);
// If your OTP is six digits number, you may use the below code
Pattern pattern = Pattern.compile(OTP_REGEX);
Matcher matcher = pattern.matcher(messageText);
String otp = null;
while (matcher.find()) {
otp = matcher.group();
}
if(otp != null && et_code != null) {
et_code.setText(otp);
}
}
});
}
以下の手順に従って、本番用のキーを取得します。
コマンドを実行して AppSignatureHelper Class でハッシュを取得すると、そのキーがプロダクションキーになります。
最初にアプリ署名証明書の.derファイルをダウンロードしてから、このコマンドで.jksファイルに変換します
keytool -import -alias your_alias -keystore file_name_created -file certificate.der
その後、新しい.jksファイルが作成されます
次に、このコマンドを使用して、リリースのハッシュを生成します
keytool -exportcert -alias your_alias -keystore certificate.jks | xxd -p | tr -d "[:space:]" | echo -n app_package_name `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11
ハッシュ文字列を作成すると、Playストアアプリで機能します。
数日前、私は同じ問題を抱えていました。実際、コードには何も問題はありません。アプリを実行してハッシュを作成すると、デバイス固有のハッシュのみが作成されます。署名付きapkを生成して(logを使用して)ハッシュを作成する場合、このハッシュはリリース専用であり、実稼働用ではありません。本番の場合、Play Storeからアプリをインストールし、(ログを使用して)ハッシュをチェックする必要があり、そのハッシュはすべてのユーザーに使用されます。
それがあなたを助けることを願っています
次に、次のコマンドを使用して、キーストア拡張子を付けてyourkeystore.keystoreに変換します。
keytool -import -alias your_alias -keystore file_name_created.keystore -file certificate.der
次に、作成したキーストアを使用して文字列ハッシュを作成します。
このファイルbashを使用して、ハッシュ文字列を作成します。
https://github.com/googlesamples/Android-credentials/tree/master/sms-verification/bin
私は同じ問題を抱えていました
SMSRETRIEVERAPI
デバッグビルド用のotpを取得しましたが、playstoreにプッシュしたとき、otpを自動読み取りしません。実際には、アプリケーションビルドのバリアントタイプに基づいてハッシュキーを生成します。So Inorder to auto read your otp you will change the your hashkey in your server that will be generated in release mode.
リリースモードでHashkeyを見つけて、サーバーで更新します。
リリースハッシュはデバッグハッシュとは異なるため、サーバーから送信されたメッセージにリリースアプリの文字列ハッシュを追加する必要があります SMS retriever verify
新しいハッシュ値を生成し、サーバーからSMS経由で送信しましたか?