【问题标题】:How fix to SMS Retriever API如何修复 SMS Retriever API
【发布时间】:2019-09-05 11:33:21
【问题描述】:

我编写了例如“SMS Retreiver API”https://developers.google.com/identity/sms-retriever/request 的代码 但我不会得到我不会的结果

这段代码传递给 MainActivity。

SmsRetrieverClient client = SmsRetriever.getClient(this);
                Task<Void> task = client.startSmsRetriever();
                task.addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                    }
                });
                    task.addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                       }
                    });

此代码传递给 MySMSBroadcastReceiver。

public class MySMSBroadcastReceiver extends BroadcastReceiver {
    String message;
    Status status;
    private static MessageListener mListener;
    @Override
    public void onReceive(Context context, Intent intent) {
        if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
            Bundle extras = intent.getExtras();
            status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
            switch(status.getStatusCode()) {
                case CommonStatusCodes.SUCCESS:
                    // Get SMS message contents
                    message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
                    // Extract one-time code from the message and complete verification
                    // by sending the code back to your server.
                    break;
                case CommonStatusCodes.TIMEOUT:
                    // Waiting for SMS timed out (5 minutes)
                    // Handle the error ...
                    break;
            }
            mListener.MySMSBroadcastReceiver(message);
        }
    }
    public static void bindListener(MessageListener listener){
        mListener = listener;
    }
}

在我的清单中

<receiver android:name="ru.project.MBank.MySMSBroadcastReceiver" android:exported="true">
            <intent-filter>
                <action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED"/>
            </intent-filter>
        </receiver>

但结果一无所获。 帮忙看看我做错了什么?

【问题讨论】:

    标签: javascript android api android-studio


    【解决方案1】:

    我有同样的问题。首先,您需要生成一个唯一密钥(应用程序签名)来识别消息和您的设备。生成密钥后,您的广播公司将能够检测到消息。

    public class AppSignature extends ContextWrapper {
    public static final String TAG = AppSignature.class.getSimpleName();
    
    private static final String HASH_TYPE = "SHA-256";
    public static final int NUM_HASHED_BYTES = 9;
    public static final int NUM_BASE64_CHAR = 11;
    
    public AppSignature(Context context) {
        super(context);
    }
    
    /**
     * Get all the app signatures for the current package
     * @return
     */
    public ArrayList<String> getAppSignatures() {
        ArrayList<String> appCodes = new ArrayList<>();
    
        try {
            // Get all package signatures for the current package
            String packageName = getPackageName();
            PackageManager packageManager = getPackageManager();
            Signature[] signatures = packageManager.getPackageInfo(packageName,
                    PackageManager.GET_SIGNATURES).signatures;
    
            // For each signature create a compatible hash
            for (Signature signature : signatures) {
                String hash = hash(packageName, signature.toCharsString());
                if (hash != null) {
                    appCodes.add(String.format("%s", hash));
                }
            }
        } catch (PackageManager.NameNotFoundException e) {
            Log.e(TAG, "Unable to find package to obtain hash.", e);
        }
        return appCodes;
    }
    
    private static String hash(String packageName, String signature) {
        String appInfo = packageName + " " + signature;
        try {
            MessageDigest messageDigest = MessageDigest.getInstance(HASH_TYPE);
            messageDigest.update(appInfo.getBytes(StandardCharsets.UTF_8));
            byte[] hashSignature = messageDigest.digest();
    
            // truncated into NUM_HASHED_BYTES
            hashSignature = Arrays.copyOfRange(hashSignature, 0, NUM_HASHED_BYTES);
            // encode into Base64
            String base64Hash = Base64.encodeToString(hashSignature, Base64.NO_PADDING | Base64.NO_WRAP);
            base64Hash = base64Hash.substring(0, NUM_BASE64_CHAR);
            return base64Hash;
        } catch (NoSuchAlgorithmException e) {
        }
        return null;
    }
    

    }

    之后,在您的第一个活动中启动该课程。 希望这会对你有所帮助。

    【讨论】:

    • 你能帮帮我吗? MainActivity 中的这段代码在哪里?我试过但没有用。
    • 创建单独的类 AppSignature 并粘贴此代码就是该类。在您的主要活动中创建此类的对象之后。
    • 你好!帮帮我,我不解析短信检索器 API
    • 您是否在应用中添加了依赖项?如果你没有添加依赖,添加,实现“com.google.android.gms:play-services-auth:16.0.1”
    猜你喜欢
    • 2019-07-26
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2019-07-15
    • 2021-06-13
    • 1970-01-01
    相关资源
    最近更新 更多