前言
因为我的手机是一加3T,氧os,不像miui,flyme这些定制化的国产Rom,收到短信验证码的时候可以直接复制验证码,苦于氧os无法直接短信验证码,为此制作了此应用。
大致思路
首先需求是将短信中含有的验证码复制到剪贴板,为此我们需要做以下几步:
- 获取短信内容
- 判断短信中是否含有验证码,如果有则提取出来,如果没有就告知用户没有匹配出短信验证码
- 将匹配出的短信验证码复制到剪贴板
开始制作
1. 获取短信内容
我们知道,每当系统接收到一条短信便会发出一条广播
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
为此,我们首先需要做的就是配置一个广播接收者来响应这条广播
SMSReceiver.java
public class SMSReceiver extends BroadcastReceiver {
private static final String TAG = "SMSReceiver";
@Override
public void onReceive(Context context, Intent intent) {
//进行获取短信的操作
getMsg(context, intent);
}
}
然后在AndroidManifest.xml文件中配置短信接受者:
<receiver android:name=".SMSReceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
注意设置此广播接收者的级别为最高(1000),同时不要忘了添加接收和读取短信的权限:
<uses-permission android:name="android.permission.RECEIVE_SMS" /> <!-- 接收短信权限 -->
<uses-permission android:name="android.permission.READ_SMS" /> <!-- 读取短信权限 -->
注意!!!
由于Google在Android6.0引入了运行时权限,使得只要API版本大于23的都需要进行权限的申请,在这里推荐使用一个非常简单快速的第三方库来进行运行时权限的申请,Android 6.0运行时权限第三方库的使用-----RxPermissions
接下来进行短信内容的获取
private void getMsg(Context context, Intent intent) {
//pdus短信单位pdu
//解析短信内容
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
assert pdus != null;
for (Object pdu : pdus) {
//封装短信参数的对象
SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdu);
String number = sms.getOriginatingAddress();
String body = sms.getMessageBody();
//写自己的处理逻辑
//获取短信验证码
getCode(context, body);
}
}
通过SmsMessage对象可以得到短信的发送号码,短信内容及相关信息。
2. 匹配出验证码并复制到剪贴板
private void getCode(Context context, String body) {
//获取剪贴板管理器:
ClipboardManager cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
Pattern pattern1 = Pattern.compile("(\\d{6})");//提取六位数字
Matcher matcher1 = pattern1.matcher(body);//进行匹配
Pattern pattern2 = Pattern.compile("(\\d{4})");//提取四位数字
Matcher matcher2 = pattern2.matcher(body);//进行匹配
if (matcher1.find()) {//匹配成功
String code = matcher1.group(0);
// 创建普通字符型ClipData
ClipData mClipData = ClipData.newPlainText("Label", code);
// 将ClipData内容放到系统剪贴板里。
cm.setPrimaryClip(mClipData);
Toast.makeText(context, "验证码复制成功", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onReceive: " + code);
} else if (matcher2.find()) {
String code = matcher2.group(0);
// 创建普通字符型ClipData
ClipData mClipData = ClipData.newPlainText("Label", code);
// 将ClipData内容放到系统剪贴板里。
cm.setPrimaryClip(mClipData);
Toast.makeText(context, "验证码复制成功", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onReceive: " + code);
} else {
Toast.makeText(context, "未检测到验证码", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onReceive: " + "未检测到验证码");
}
}
在这里通过正则表达式匹配出短信内容中的验证码,因为验证码大多数为4位或者6位,所以在这里为了简化就直接进行了4位验证码和6位验证码的判断
至于将文本内容复制到剪贴板的操作,给出一段示例代码即可理解
//获取剪贴板管理器:
ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
// 创建普通字符型ClipData
ClipData mClipData = ClipData.newPlainText("Label", "这里是要复制的文字");
// 将ClipData内容放到系统剪贴板里。
cm.setPrimaryClip(mClipData);
如果想要详细了解的推荐这篇文章:android开发 -- 复制文本内容到系统剪贴板(自由复制)
最后附上这个demo的地址:CopySMSCode