1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 登录页获取短信验证码 读取短信验证码到键盘

登录页获取短信验证码 读取短信验证码到键盘

时间:2024-06-21 04:52:48

相关推荐

登录页获取短信验证码 读取短信验证码到键盘

需要实现如下效果:

首先定义一个SMSContentObserver 来拦截短信内容:

package “你的包名”;import android.content.Context;import android.database.ContentObserver;import android.database.Cursor;import .Uri;import android.os.Handler;import android.text.TextUtils;import android.util.Log;import java.util.regex.Matcher;import java.util.regex.Pattern;public class SMSContentObserver extends ContentObserver {private static String TAG = "SMSContentObserver";private String patternCoder = "\\d{4}";//正则表达式 取4位数private String strContent; //验证码内容private Context mContext ;private Handler mHandler ;//更新UI线程private String TELPHONE = "TMRTXMIN"; // 短信来源号码private String TelPHONECONTEXT ="iViralLink"; // 短信内容 特殊关键字// 8448631136public SMSContentObserver(Context context, Handler handler) {super(handler);mContext = context ;mHandler = handler ;}/*** 当所监听的Uri发生改变时,就会回调此方法** @param selfChange 此值意义不大 一般情况下该回调值false*/@Overridepublic void onChange(boolean selfChange){Log.i(TAG, "the sms table has changed");//查询收件箱里的内容Uri outSMSUri = Uri.parse("content://sms/inbox") ;Cursor c = mContext.getContentResolver().query(outSMSUri, null, null, null,"date desc");if(c != null){Log.i(TAG, "the number of send is "+c.getCount()) ;StringBuilder sb = new StringBuilder() ;c.moveToNext();String message = c.getString(c.getColumnIndex("body"));// 短信内容String phone = c.getString(c.getColumnIndex("address")); //短信来源号码Log.i(TAG,"message : "+message);Log.i(TAG,"phone : "+phone);c.close();// if(checkPhone(phone) &&checkString(message)){ //指定号码 指定字符串匹配String code = patternCode(message);assert code != null;if(!TextUtils.isEmpty(code) ){strContent = code;}mHandler.obtainMessage(1, sb.toString()).sendToTarget();// }}}//指定一个号码,只读取与他有关的新消息。private boolean checkPhone(String phone) {// TODO Auto-generated method stubString c_phone = TELPHONE;if(c_phone.equals(phone) )return true;return false;}//指定一关键字符串,用来确认短信内容是我们想要去提取的private boolean checkString(String message){if(TextUtils.isEmpty(message))return false;Pattern p = pile(TelPHONECONTEXT);//这个关键字符串可以自定义Matcher matcher = p.matcher(message);if(matcher.find())return true;return false;}//匹配短信中的数字(验证码)private String patternCode(String patternContent){if(TextUtils.isEmpty(patternContent))return null;Pattern p = pile(patternCoder);Matcher matcher = p.matcher(patternContent);if(matcher.find())return matcher.group();return null;}public String getStrContent(){return strContent;}}

然后在需要的地方调用:

private SMSContentObserver smsContentObserver;private Handler mHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case 1:String outbox = smsContentObserver.getStrContent();//(String) msg.obj; 验证码内容 //et_code.setText(outbox); //直接把验证码输入到指定输入框break;default:break;}}};private void initRegisterContentObserver() {smsContentObserver = new SMSContentObserver(this, mHandler);Uri smsUri = Uri.parse("content://sms");getContentResolver().registerContentObserver(smsUri, true, smsContentObserver);}@Overrideprotected void onDestroy() {super.onDestroy();if (getContentResolver()!=null){getContentResolver().unregisterContentObserver(smsContentObserver);}}@Overrideprotected int getLayoutId() {return R.layout.act_register;}@Overrideprotected void onCreate(@Nullable Bundle bundle) {super.onCreate(bundle);initRegisterContentObserver(); //初始化smsContentObserver 拦截验证码}

需要注意,edittext的inputstyle需要设置为number:

<EditTextandroid:id="@+id/et_code"android:layout_width="match_parent"android:layout_height="@dimen/dp30"android:background="@null"android:layout_centerVertical="true"android:layout_toRightOf="@+id/iv_code"android:lines="1"android:textSize="@dimen/sp14"android:hint="请输入验证码"android:textColorHint="#999"android:textColor="#fff"android:inputType="number"android:layout_toLeftOf="@+id/tv_get_code"android:layout_marginRight="@dimen/dp10"/>

最后就是在获取短信权限,这个属于危险权限,需要动态获取:

@Overrideprotected void onCreate(@Nullable Bundle bundle) {super.onCreate(bundle);if(!checkPermission()) if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){requestPermissions(PS, PS.hashCode());}initRegisterContentObserver();}public void onRequestPermissionsResult(int req, @NonNull String[] ps, @NonNull int[] res){if(req==PS.hashCode()){if(!checkPermission()) getProxy().alert("定位权限不足,请检查手机设置");return;}super.onRequestPermissionsResult(req, ps, res);}boolean checkPermission(){boolean ok=true;for(String p: PS){ok=checkCallingOrSelfPermission(p)== PackageManager.PERMISSION_GRANTED;if(!ok) break;}if(!ok) return false;return true;}static final String[] PS={// Manifest.permission.ACCESS_FINE_LOCATION, //定位// Manifest.permission.WRITE_EXTERNAL_STORAGE, //SD卡写入Manifest.permission.READ_SMS,Manifest.permission.RECEIVE_SMS};

实际完成实现的效果如下:

完成~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。