第二阶段每日汇报20230508

为安卓项目添加一个短信验证码登录,需要借用MOB的SDK和API

代码如下:

配置SDK:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
mavenCentral()
jcenter()
}
dependencies {
// 注册MobSDK
classpath "com.android.tools.build:gradle:7.3.0"//写入自己的版本号即可;
classpath "com.mob.sdk:MobSDK:+"
}
}
//plugins {
// id 'com.android.application' version '7.3.0' apply false
// id 'com.android.library' version '7.3.0' apply false
//}
task clean(type: Delete) {
delete rootProject.buildDir
}

加入对应依赖包

plugins {
id 'com.android.application'
// MOB 添加插件
id 'com.mob.sdk'
}
// 在MobSDK的扩展中注册SMSSDK的相关信息
MobSDK {
appKey "你申请的密钥"
appSecret "替换为mob官方申请的appkey对应的appSecret"
// MOB短信验证
SMSSDK {}
}
==============
implementation 'io.github.bmob:android-sdk:3.8.13'
implementation 'io.reactivex.rxjava2:rxjava:2.2.8'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'com.squareup.okhttp3:okhttp:4.8.1'
implementation 'com.squareup.okio:okio:2.2.2'
implementation 'com.google.code.gson:gson:2.8.5'
// implementation 'com.wenwenwen888:searchbox:1.0.1'
implementation 'com.wenwenwen888:searchbox:1.0.1'
implementation 'com.jakewharton:butterknife:8.8.1'

配置settings.gradle中的设置
因为新版中settings.gradle配置中默认设置依赖模式为FAIL_ON_PROJECT_REPOS,导致直接或通过插件直接声明的任何存储库都将触发构建错误,故我们将其替换成;repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)

并在加这个是因为mob会被判定为不安全的协议而无法引入;

maven { allowInsecureProtocol = true //加这个是因为mob会被判定为不安全的协议而无法引入 url "http://mvn.mob.com/android"}

dependencyResolutionManagement {
//repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)替换成
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
repositories {
google()
mavenCentral()
jcenter() // Warning: this repository is going to shut down soon
maven { url "https://jitpack.io" }
// 1.添加MobSDK Maven地址
maven { allowInsecureProtocol = true //加这个是因为mob会被判定为不安全的协议而无法引入
url "http://mvn.mob.com/android"}
}
}

添加权限

<!-- 连接网络权限,用于执行云端语音能力 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 读取网络信息状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取当前wifi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 允许程序改变网络连接状态 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <!-- 读取手机信息权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 读取联系人权限,上传联系人需要用到此权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" /> <!-- 外存储写权限,构建语法需要用到此权限 -->
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="CoarseFineLocation" /> <!-- 外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 手机定位信息,用来为语义等功能提供定位,提供更精准的服务 -->
<!-- 定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"
tools:ignore="CoarseFineLocation" /> <!-- 如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />

mainactivity代码实现:

package com.example.phone_end;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
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.mob.MobSDK;

import java.util.Timer;
import java.util.TimerTask;

import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;

public class MainActivity extends AppCompatActivity {
//所需申请的权限
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.INTERNET,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.CHANGE_NETWORK_STATE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.CAMERA
};

EventHandler eventHandler;
EditText editTextPhone,editTextNumber;
Button get_code_id,login_id;
Timer timer;
int count = 60;
@SuppressLint("HandlerLeak")
Handler handler = new Handler(Looper.getMainLooper()){
public void handleMessage(Message msg) {
int tag = msg.what;
switch (tag){
case 1:
int arg = msg.arg1;
if(arg==1){
get_code_id.setText("重新获取");//计时结束停止计时把值恢复
count = 60;
timer.cancel();
get_code_id.setEnabled(true);
}else{
get_code_id.setText(count+"");
}
break;
case 2:
Toast.makeText(MainActivity.this,"获取短信验证码成功",Toast.LENGTH_LONG).show();
break;
case 3:
Log.i("Codr","获取短信验证码失败");
Toast.makeText(MainActivity.this,msg.getData().getString("code"),Toast.LENGTH_LONG).show();
//Toast.makeText(MainActivity.this,"获取短信验证码失败",Toast.LENGTH_LONG).show();
break;
case 4:
Toast.makeText(MainActivity.this,msg.getData().getString("code"),Toast.LENGTH_LONG).show();
break;
default:
break;
}

};
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
applypermission();

MobSDK.submitPolicyGrantResult(true,null);
init();

}
//定义判断权限申请的函数,在onCreat中调用就行
public void applypermission(){
if(Build.VERSION.SDK_INT>=23){
boolean needapply=false;
for(int i=0;i<PERMISSIONS_STORAGE.length;i++){
int chechpermission= ContextCompat.checkSelfPermission(getApplicationContext(),
PERMISSIONS_STORAGE[i]);
if(chechpermission!= PackageManager.PERMISSION_GRANTED){
needapply=true;
}
}
if(needapply){
ActivityCompat.requestPermissions(MainActivity.this,PERMISSIONS_STORAGE,1);
}
}
}
//重载用户是否同意权限的回调函数,进行相应处理
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
for(int i=0;i<grantResults.length;i++){ //检查权限是否获取
if(grantResults[i]==PackageManager.PERMISSION_GRANTED){
//同意后的操作
//Toast.makeText(MainActivity.this, permissions[i]+"已授权",Toast.LENGTH_SHORT).show();//提示
}
else {
//不同意后的操作
//Toast.makeText(MainActivity.this,permissions[i]+"拒绝授权",Toast.LENGTH_SHORT).show();//提示

}
}
}

private void init(){
editTextPhone = findViewById(R.id.editTextPhone);
editTextNumber = findViewById(R.id.editTextNumber);
get_code_id = findViewById(R.id.get_code_id);
get_code_id.setOnClickListener(this::onClick);
login_id = findViewById(R.id.login_id);
login_id.setOnClickListener(this::onClick);

eventHandler = new EventHandler() {
@Override
public void afterEvent(int event, int result, Object data) {// TODO 此处为子线程!不可直接处理UI线程!处理后续操作需传到主线程中操作!
Log.i("返回:",event+" | "+result+" | "+data.toString());
if (result == SMSSDK.RESULT_COMPLETE) {//成功回调
if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {//提交短信、语音验证码成功
Bundle bundle = new Bundle();
bundle.putString("code","登录成功!");
Message message = new Message();
message.what = 4;
message.setData(bundle);
handler.sendMessage(message);
} else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
Message message = new Message();
message.what = 2;
handler.sendMessage(message);
} else if (event == SMSSDK.EVENT_GET_VOICE_VERIFICATION_CODE) {//获取语音验证码成功
Message message = new Message();
message.what = 2;
handler.sendMessage(message);
}
} else if (result == SMSSDK.RESULT_ERROR) {//失败回调
if(event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE){//提交返回
Bundle bundle = new Bundle();
bundle.putString("code","输入的验证码不正确!");
Message message = new Message();
message.what = 4;
message.setData(bundle);
handler.sendMessage(message);
}else{
Bundle bundle = new Bundle();
bundle.putString("code",data.toString());
Message message = new Message();
message.what = 3;
message.setData(bundle);
handler.sendMessage(message);
}

} else {//其他失败回调
((Throwable) data).printStackTrace();
}
}
};
SMSSDK.registerEventHandler(eventHandler); //注册短信回调
}

private void onClick(View view) {
String phone = "";
String code = "";
int id = view.getId();
switch (id){
case R.id.get_code_id:
phone = editTextPhone.getText().toString().trim();
if (!TextUtils.isEmpty(phone)){//倒计时
CountdownStart();
getVerificationCode("86",phone);
}else{
Toast.makeText(this,"请输入手机号码",Toast.LENGTH_LONG).show();
}
break;
case R.id.login_id:
phone = editTextPhone.getText().toString().trim();
code = editTextNumber.getText().toString().trim();
if (TextUtils.isEmpty(phone)){
Toast.makeText(this,"请输入手机号码",Toast.LENGTH_LONG).show();
}else if (TextUtils.isEmpty(code)){
Toast.makeText(this,"请输入验证码",Toast.LENGTH_LONG).show();
}else{//登录逻辑
/**
* cn.smssdk.SMSSDK.class
* 提交验证码
* @param country 国家区号
* @param phone 手机号
* @param code 验证码
*/
SMSSDK.submitVerificationCode("86",phone,code);//提交验证码

}
break;
}
}

/**
* cn.smssdk.SMSSDK.class
* 请求文本验证码
* @param country 国家区号
* @param phone 手机号
*/
public static void getVerificationCode(String country, String phone){
//获取短信验证码
SMSSDK.getVerificationCode(country,phone);
}

/**cn.smssdk.SMSSDK.class
* 请求文本验证码(带模板编号)
* @param tempCode 模板编号
* @param country 国家区号
* @param phone 手机号
*/
public static void getVerificationCode(String tempCode,String country, String phone){
//获取短信验证码
SMSSDK.getVerificationCode(tempCode,country,phone);
}

//倒计时函数
private void CountdownStart(){
get_code_id.setEnabled(false);
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Message message = new Message();
message.what = 1;
message.arg1 = count;
if(count!=0){
count--;
}else {
return;
}
handler.sendMessage(message);
}
}, 1000,1000);
}

@Override
protected void onDestroy() {
super.onDestroy();// 使用完EventHandler需注销,否则可能出现内存泄漏
SMSSDK.unregisterEventHandler(eventHandler);
}

}

 

 

注:测试版本,仅用于验证可行性

 

posted @   一直队  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示