我需要一种方法来验证我的Android应用程序中设置的手机号码是否正确,如“所有权” - 而不是手机号码的数据验证。
E.g。 WhatsApp的做法......
我知道如何使用代码和内容进行短信验证。问题是它是一个免费的Android应用程序,我不想热衷于在应用程序免费时支付每个发送的短信。糟糕的商业模式......
有没有办法安全无忧地执行此操作?
使用API代码似乎不太安全,因此我不担心这个选项:
TelephonyManager tMgr (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
mPhoneNumber = tMgr.getLine1Number();
答案 0 :(得分:19)
WhatsApp没有向您发送任何短信,它会将您自己的手机短信发送到您自己的号码。如果您收到短信,一切正常,如果您没有收到短信,则不会拥有该号码。这是检查用户是否使用实际号码注册的唯一便宜且简单的方法。
答案 1 :(得分:2)
Google Play服务有两个新API可帮助您获取用户 电话号码并通过短信验证它没有设备权限: 电话选择器和短信搜索器。
使用电话选择器获取号码
第一步是让用户启动短信验证 在你的应用程序内您的应用可能会提示用户输入手机 数字,您可以使用电话选择器使这更容易使用 像这样的代码:
// Construct a request for phone numbers and show the picker private void requestHint() { HintRequest hintRequest = new HintRequest.Builder() .setPhoneNumberIdentifierSupported(true) .build(); PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent( apiClient, hintRequest); startIntentSenderForResult(intent.getIntentSender(), RESOLVE_HINT, null, 0, 0, 0); }
HintRequest构建器告诉Play服务一个电话号码 标识符是必需的。然后用它来创建和启动一个意图, 这将向用户显示播放服务对话框,允许他们使用 选择他们的电话号码与应用分享。这个API没有 需要任何权限,并显示可用的号码 电话或Google帐户供用户选择。
当用户选择电话号码时,它将返回到 在运行the的设备上以E164格式在onActivityResult中应用 Play服务的最新版本。请注意,在某些情况下,取决于 你的手机,你可能没有电话号码,所以一定要检查一下 凭证不为空。如果你没有号码,你需要 为您的用户提供一种手动输入的方式。
// Obtain the phone number from the result @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RESOLVE_HINT) { if (resultCode == RESULT_OK) { Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY); // credential.getId(); <-- E.164 format phone number on 10.2.+ devices } } }
此时,您的用户将拥有一个电话号码字符串。而 这很有用,您可能想要验证用户是否拥有此功能 特定数字,例如允许它们发送或检索 与其他用户联系或使用此号码表明自己的信息。
使用SMS Verification API验证号码
验证电话号码所有权的一种简单方法是发送短信至 数字,包含一次验证码,并拥有它们 将其输入您的应用程序。 SMS验证API为您提供 应用程序能够侦听来自哪个短信 自动解析代码。
要开始使用,您的应用将使用SmsRetrieverClient,代码如下:
SmsRetrieverClient client = SmsRetriever.getClient(this /* context */); Task<Void> task = client.startSmsRetriever(); task.addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { // successfully started an SMS Retriever for one SMS message } }); task.addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { }); );
这非常简单 - 你得到一个SMS Retriever客户端,然后启动一个 它的任务。该任务有一个成功监听器和一个on 无法覆盖。启动SMS Retriever后,您将发送 用户的电话号码到您的服务器并启动它的工作流程 生成消息并将其发送到该号码。
需要以特定方式构建消息。消息 必须符合SMS消息,因此它不能超过140个字节。它 需要以特定的前缀开头:&#39;&lt;#&gt;&#39;或连续两次 零宽度空格字符(U + 200B)。请参阅documentation 您的更多信息。它必须以11个字符的哈希结尾 识别您的应用,如下所述。
示例:
&LT;#&GT;在示例应用程序中使用123456作为验证码!
FA + 9qCX9VSu
一次性验证码可以是任何字符串:您可以简单 生成一个随机数。消息需要以散列结束 根据这里的程序确定。 Google Play服务会 使用此哈希来确定验证消息的用途。 您只需要为您的应用包生成一次此哈希值 签署证书:它不会改变,也不应该被提供 客户端应用。
然后,您的服务器可以使用您现有的信息将消息发送到手机 SMS基础设施或服务。收到此消息后,Google 播放服务广播包含文本的意图 信息。这是代码:
public class MySMSBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { 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: String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE); break; case CommonStatusCodes.TIMEOUT: break; } } } }
在广播接收器的onReceive中,您可以获得额外内容 从那里拉出状态。如果状态指示该消息 成功收到,您可以从附加内容中提取消息。 从这里,您可以解析验证码并将其发回 您的服务器以确认电话号码所有权。