提示:站在巨人肩膀上的小白,大家可以提出自己的看法。如有侵删;
原文参考链接:
https://blog.csdn.net/qq_52139206/article/details/124552348
前言
作为小白,我也踩了不少坑。但是我们要学会爬起来,希望本篇文章会对你有所帮助!
目录
一、创建项目
1、通过官网进行注册
(开发者服务==>短信验证==>创建应用(填写相关信息进行创建应用);
2、 进入界面之后,会出现提示,依次进行点击配置即可;
3、出现下方相关信息(AppKey和AppSecret),在此你要进行寻找包名和MD5签名
2.如何寻找包名和MD5签名
(1)点击Android左侧的小象,通过点击Tasks==>signingReport;
若是左侧的小象图标不显示,则点击文件菜单中的大象;
(2)包名的查看
法一:
法二:
4、然后我们返回首页,点击开发者服务中的SDK下载;之后勾选进行短信验证==>下载;
二、使用步骤
1.配置你的MobSDK的设置
// 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
}
2.加入对应的依赖包
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'
3.配置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"}
}
}
4.添加权限
<!-- 连接网络权限,用于执行云端语音能力 -->
<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" />
5.MianActivity.java中功能代码的实现:
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);
}
}
5.布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="50dp"
android:paddingRight="10dp"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/login_phone_textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:gravity="right"
android:padding="10dp"
android:text="手机号码:" />
<EditText
android:id="@+id/editTextPhone"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="9"
android:ems="10"
android:inputType="phone"
android:text="" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/login_code_textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:gravity="center"
android:padding="10dp"
android:text="短信验证码: " />
<EditText
android:id="@+id/editTextNumber"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4"
android:ems="10"
android:inputType="number"
android:text="" />
<Button
android:id="@+id/get_code_id"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:gravity="center"
android:text="获取验证码 ">
</Button>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="50dp">
<Button
android:id="@+id/login_id"
android:layout_width="100dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:text="登录" />
</LinearLayout>
</LinearLayout>
可能会出现:Execution failed for task ':app:checkDebugDuplicateClasses'.的报错
需要在gradle.properties中添加一下代码即可;
android.nonTransitiveRClass=true
android.enableJetifier=true
MobSDK.spEdition=FP
若有问题,欢迎留言指正;