Android 在SMS Retriever API中在何处使用11位生成的哈希键?

Android 在SMS Retriever API中在何处使用11位生成的哈希键?,android,Android,我已经在服务器和android端设置了所有东西。我的流程运行良好。我也生成了hashkey,但现在不知道在哪里使用它 注意:我删除了接收短信的权限,现在侦听器没有呼叫 代码: private void startSMSListener(){ 试一试{ smsReceiver=新的smsReceiver(); smsReceiver.setOTPListener(本); IntentFilter IntentFilter=新的IntentFilter(); intentFilter.addActi

我已经在服务器和android端设置了所有东西。我的流程运行良好。我也生成了hashkey,但现在不知道在哪里使用它

注意:我删除了接收短信的权限,现在侦听器没有呼叫

代码:

private void startSMSListener(){
试一试{
smsReceiver=新的smsReceiver();
smsReceiver.setOTPListener(本);
IntentFilter IntentFilter=新的IntentFilter();
intentFilter.addAction(SmsRetriever.SMS\u retrieve\u ACTION);
此注册表接收程序(smsReceiver,intentFilter);
SmsRetrieverClient=SmsRetriever.getClient(此);
Task=client.startSmsRetriever();
task.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公开作废(作废避免){
//API已成功启动
}
});
task.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
//无法启动API
}
});
}捕获(例外e){
e、 printStackTrace();
}
}
更新:我没有得到OTP: 服务器端代码:

//Prepare Url
                OkHttpClient client=new OkHttpClient();
                Request request = new Request.Builder()
                        .url("http://msg.msgclub.net/rest/services/sendSMS/sendGroupSms?AUTH_KEY="+authKey+"&message=<#>You OTP is:"+randomPIN+"TthI79n9NvR&senderId=REMIND&routeId=1&mobileNos="+mobNo+"&smsContentType=english")
                        .get()
                        .addHeader("Cache-Control", "no-cache")
                        .build();
//准备Url
OkHttpClient=新的OkHttpClient();
Request Request=newrequest.Builder()
.url(“http://msg.msgclub.net/rest/services/sendSMS/sendGroupSms?AUTH_KEY=“+authKey+”&message=您的OTP是:“+randomPIN+”TthI79n9NvR&senderId=提醒&routeId=1&mobileNos=“+mobNo+”&smsContentType=english”)
.get()
.addHeader(“缓存控制”、“无缓存”)
.build();
我应该在OnReive方法中尝试哪种逻辑?谁能给我指路吗? 代码:

导入android.content.BroadcastReceiver;
导入android.content.Context;
导入android.content.Intent;
导入android.os.Bundle;
导入android.util.Log;
导入com.google.android.gms.auth.api.phone.SmsRetriever;
导入com.google.android.gms.common.api.CommonStatusCodes;
导入com.google.android.gms.common.api.Status;
导入com.tekitsolution.remently.Dialog.PaymentListDialog;
导入com.tekitsolution.remendly.Listener.SMSListener;
公共类SMSReceiver扩展了BroadcastReceiver{
私有静态最终字符串标记=SMSReceiver.class.getSimpleName();
私人SMSListener mListener;
/**
*@param-mListener
*/
公共无效设置程序(SMSListener mListener){
this.mListener=mListener;
}
/**
*@param上下文
*@param意图
*/
@凌驾
公共void onReceive(上下文、意图){
showLog(“内部短信接收器”);
if(SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())){
Bundle extras=intent.getExtras();
Status Status=(Status)extras.get(SmsRetriever.EXTRA_Status);
开关(status.getStatusCode()){
案例CommonStatusCodes.SUCCESS:
//这是完整的信息
String message=(String)extras.get(SmsRetriever.EXTRA\u SMS\u message);
显示日志(“消息:”+消息);
/*您的示例应用程序代码是:123ABC78
FA+9qCX9VSu*/
//提取OTP代码并发送给侦听器
if(mListener!=null){
mListener.onotprived(消息);
}
打破
案例CommonStatusCodes.API_未连接:
if(mListener!=null){
mListener.onOTPReceivedError(“API未连接”);
}
打破
案例CommonStatusCodes.NETWORK_错误:
if(mListener!=null){
mListener.onOTPReceivedError(“网络错误”);
}
打破
case CommonStatusCodes.ERROR:
if(mListener!=null){
mListener.onOTPReceivedError(“有些事情出了差错”);
}
打破
}
}
}
私有void showLog(字符串msg){
Log.d(标签、消息);
}
}
OTP活动:在onCreate内调用此方法:

 private void startSMSListener() {
        try {
            smsReceiver = new SMSReceiver();
            smsReceiver.setOTPListener(this);

            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(SmsRetriever.SMS_RETRIEVED_ACTION);
            this.registerReceiver(smsReceiver, intentFilter);

            SmsRetrieverClient client = SmsRetriever.getClient(this);

            Task<Void> task = client.startSmsRetriever();
            task.addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                   showLog("success");
                }
            });

            task.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    showLog("failure");
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
private void startSMSListener(){
试一试{
smsReceiver=新的smsReceiver();
smsReceiver.setOTPListener(本);
IntentFilter IntentFilter=新的IntentFilter();
intentFilter.addAction(SmsRetriever.SMS\u retrieve\u ACTION);
此注册表接收程序(smsReceiver,intentFilter);
SmsRetrieverClient=SmsRetriever.getClient(此);
Task=client.startSmsRetriever();
task.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公开作废(作废避免){
showLog(“成功”);
}
});
task.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
显示日志(“失败”);
}
});
}捕获(例外e){
e、 printStackTrace();
}
}
  • 你的短信格式应该是
SampleApp:您的验证码是143567 QbwSot12oP

1)消息应以开头,表示这是发送给系统的OTP消息。

2)消息应以Hashcode结尾,例如消息末尾的QbwSot12oP。

所以,您必须将生成的哈希传递给服务器,并在短信的最后附加它

下面是RetriveAPI的完整示例。我用过它,它在我的情况下工作

在给定示例中,通过AppSignatureHelper实用地生成哈希键。把它递给你
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import com.google.android.gms.auth.api.phone.SmsRetriever;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.common.api.Status;
import com.tekitsolution.remindly.Dialog.PaymentListDialog;
import com.tekitsolution.remindly.Listener.SMSListener;

public class SMSReceiver extends BroadcastReceiver {
    private static final String TAG = SMSReceiver.class.getSimpleName();

    private SMSListener mListener;

    /**
     * @param mListener
     */
    public void setOTPListener(SMSListener mListener) {
        this.mListener = mListener;
    }


    /**
     * @param context
     * @param intent
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        showLog("Inside SMS Receiver");
        if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
            Bundle extras = intent.getExtras();
            Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
            switch (status.getStatusCode()) {
                case CommonStatusCodes.SUCCESS:

                    //This is the full message
                    String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
                    showLog("message: "+ message);
                    /*<#> Your ExampleApp code is: 123ABC78
                    FA+9qCX9VSu*/

                    //Extract the OTP code and send to the listener

                    if (mListener != null) {
                        mListener.onOTPReceived(message);
                    }
                    break;


                case CommonStatusCodes.API_NOT_CONNECTED:

                    if (mListener != null) {
                        mListener.onOTPReceivedError("API NOT CONNECTED");
                    }

                    break;

                case CommonStatusCodes.NETWORK_ERROR:

                    if (mListener != null) {
                        mListener.onOTPReceivedError("NETWORK ERROR");
                    }

                    break;

                case CommonStatusCodes.ERROR:

                    if (mListener != null) {
                        mListener.onOTPReceivedError("SOME THING WENT WRONG");
                    }

                    break;

            }
        }
    }

    private void showLog(String msg) {
        Log.d(TAG, msg);
    }
}
 private void startSMSListener() {
        try {
            smsReceiver = new SMSReceiver();
            smsReceiver.setOTPListener(this);

            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(SmsRetriever.SMS_RETRIEVED_ACTION);
            this.registerReceiver(smsReceiver, intentFilter);

            SmsRetrieverClient client = SmsRetriever.getClient(this);

            Task<Void> task = client.startSmsRetriever();
            task.addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                   showLog("success");
                }
            });

            task.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    showLog("failure");
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }