首先来张截图(使用adb命令截取,因此跟前面有些不一样),UI效果以后再改;EditText和Button为Github开源项目FlatUi(5.0以下实现一些5.0的特性);

本代码段主要实现输入移动号码,通过正则验证,通过后向服务器请求验证码,收到短信后自动读取短信内验证码,填入下方验证码区域,将此短信标记为已读(强迫症解脱了),点击登录向服务器请求验证,成功后保存返回用户信息并关闭当前Fragment;

具体代码如下,注释写的很明白了,使用到的字符串资源

<string name="illegalNum">请输入正确的移动手机号码</string>
<string name="sms_signature">【中国移动咪咕音乐】</string>
<string name="sms_pattern">您的验证码\\:(\\d+)</string>
<string name="login_success">登录已成功</string>

package com.jl.lovemusic.fragments;
import android.content.ContentValues;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.cengalabs.flatui.views.FlatButton;
import com.cengalabs.flatui.views.FlatEditText;
import com.jl.lovemusic.R;
import com.jl.lovemusic.base.FragmentBase;
import com.jl.lovemusic.utils.Constants;
import com.jl.lovemusic.utils.Log;
import com.jl.lovemusic.utils.Message;
import com.jl.lovemusic.utils.Utils;
import com.jl.lovemusic.web.WebService;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import de.greenrobot.event.EventBus;
/**
*
*/
public class FragmentLogin extends FragmentBase {
private final static Log.ILogger L = new Log.ILogger() {
@Override
public String tag() {
return "FragmentLogin";
}
@Override
public int logLevel() {
return Log.L_A;
}
};
private FlatEditText mPhoneNumEt;
private FlatEditText mCertiNumEt;
private FlatButton mGainNumBtn;
private FlatButton mLoginBtn;
private String mPhoneNum = "";
private String mValiCode = "";
private SMSObserver mObserver;
private View.OnClickListener mClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.gainNum:
mPhoneNum = mPhoneNumEt.getText().toString();
if (isLegalPhoneNum(mPhoneNum)) {
getNumFromService(mPhoneNum);
}
break;
case R.id.confirmLogin:
checkForLogining(mPhoneNumEt.getText().toString(),
mCertiNumEt.getText().toString());
break;
default:
break;
}
}
};
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_login,null);
mPhoneNumEt = (FlatEditText) v.findViewById(R.id.phoneNum);
mCertiNumEt = (FlatEditText) v.findViewById(R.id.certiNum);
mGainNumBtn = (FlatButton) v.findViewById(R.id.gainNum);
mLoginBtn = (FlatButton) v.findViewById(R.id.confirmLogin);
mGainNumBtn.setOnClickListener(mClickListener);
mLoginBtn.setOnClickListener(mClickListener);
mObserver = new SMSObserver(new Handler(),getActivity());
setRetainInstance(true);
return v;
}
@Override
public void onResume() {
super.onResume();
getActivity().getContentResolver().registerContentObserver(
Uri.parse("content://sms/"),true,mObserver
);
}
@Override
public void onPause() {
super.onPause();
getActivity().getContentResolver().unregisterContentObserver(mObserver);
}
@Override
public void onStop() {
super.onStop();
}
/**
* 从mPhoneNum读取移动号码 验证是否移动号段 是否合法手机号 向服务器请求验证码
*
* @param phoneNum 手机号
*/
private void getNumFromService(String phoneNum){
new WebService().getValiCode(getActivity(),phoneNum);
Log.I(L,"--------正准备请求验证码------"+phoneNum);
}
/**
* 向服务器发送请求验证登录
*/
private void checkForLogining(String phoneNum,String valiCode){
new WebService().checkValiCode(getActivity(),phoneNum,valiCode);
Log.I(L,"------正在请求登录-------");
}
/**
* 验证是否是移动手机号
*
* @param phoneNum 待检验手机号
*/
private boolean isLegalPhoneNum(String phoneNum){
if(!Pattern.matches("^\\d{11}$",phoneNum)){
Utils.showMessage(getActivity(), R.string.illegalNum);
return false;
}
if(!Pattern.matches("(^1(3[5-9]|5[012789]|8[2478])\\d+)|(^134[0-8]\\d+)",phoneNum)){
Utils.showMessage(getActivity(),R.string.illegalNum);
return false;
}
return true;
}
/**
*EventBus 消息处理方法
*
* @param msg 自定义消息类
*/
@Override
public void onEventMainThread(Message msg) {
switch (msg.message){
case Constants.RSP_VALICODE:
mValiCode = msg.mExtra;
if(!TextUtils.isEmpty(mValiCode)){
mCertiNumEt.setText(mValiCode);
}
break;
case Constants.RSP_CHECK_VALICODE:
Utils.saveStringToSharedPreferences(getActivity(),mPhoneNum,msg.mExtra);
Utils.showMessage(getActivity(), R.string.login_success);
getActivity().getSupportFragmentManager().popBackStack();
default:
break;
}
}
/**
* 拦截咪咕音乐移动服务号发送的验证码短信 获取号码 自动填入 标记已读
*
*/
class SMSObserver extends ContentObserver{
private Context mContext;
public SMSObserver(Handler handler,Context context) {
super(handler);
mContext = context;
}
/**
*监视服务号码短信数据库 提取验证码
*/
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
//            查询SMS数据库 获取该服务号码内未读短信
Cursor cursor = mContext.getContentResolver().query(
Uri.parse("content://sms/inbox"),new String[]{"_id","body","read"},
"address=? and read=?",new String[]{"10658830","0"},"date desc"
);
//            处理短信数据
if(cursor!=null){
while(cursor.moveToNext()){
String id = cursor.getInt(cursor.getColumnIndex("_id"))+"";
String body = cursor.getString(cursor.getColumnIndex("body"));
Log.I(L,"-----本条短信内容为-----"+body);
if(body.contains(mContext.getString(R.string.sms_signature))){
Matcher m = Pattern.compile(mContext.getString(R.string.sms_pattern)).matcher(body);
if(m.find()){
String valiCode = m.group(1);
Message msg = new Message(Constants.RSP_VALICODE);
msg.mExtra = valiCode;
EventBus.getDefault().postSticky(msg);
//                            将此短信标记为已读状态
ContentValues values = new ContentValues();
values.put("read","1");
mContext.getContentResolver().update(Uri.parse("content://sms/inbox"),
values,"_id=?",new String[]{id});
}
}
}
cursor.close();
}
}
}
}

音乐类软件LoveMusic开发(三)----登录界面相关推荐

  1. android studio 微信登录界面,如何使用Android Studio开发用户登录界面

    满意答案 zhou9081 2016.05.21 采纳率:51%    等级:7 已帮助:411人 如何使用Android Studio开发用户登录界面,具体解决方案如下: 解决方案1: <:t ...

  2. Android开发——程序锁的实现(可用于开发钓鱼登录界面)

    1. 程序锁原理 1.1 实现效果: 在用户打开一个应用时,若此应用是我们业务内的逻辑拦截目标,那就在开启应用之后,弹出一个输入密码的界面,输入密码正确则进入目标应用.若不输入直接按返回键,则直接返回 ...

  3. 酷狗软件测试用例,仿酷狗的音乐搜软件的开发与测试.doc

    仿酷狗的音乐搜软件的开发与测试 仿酷狗的音乐搜索软件的开发与测试 摘 要 当前,面对浩瀚的网络资源,搜索引擎为所有网上冲浪的用户提供了一个入口,毫不夸张的说,所有的用户都可以搜索引擎到达自己想去的网上 ...

  4. qt登录界面跳转_每天10分钟,木辛老师带你实战慕课软件开发:登录界面开发第2课...

    软件实战开始,快速提供编程能力:通过实战,分析产品需求,梳理设计需求,提升项目分析和架构的能力.快点跟着木辛老师一起学习吧! 请点击右上角"关注"按钮关注我们哟:跟着木辛老师学习P ...

  5. 3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】

    十一休假,杭州西湖边逛了一圈只能用人山人海来形容,浙大紫金港校区也逛了一圈风景如画,建设得真不错很棒,假期就去了这2个地方,然后在家里陪老婆.看孩子.洗尿布.打了几局星际争霸,在网上接了一个B/S架构 ...

  6. Android聊天软件的开发(三)--网络连接

    一,服务器网络接口    服务器网络接口通过Servlet实现,可以获得客户端提交的数据,对数据进行查询存储操作,以及返回结果数据给客户端.客户端可以通过HTTP协议直接访问网络接口.    HTTP ...

  7. 响应式开发:登录界面实现

    学习了慕课网上响应式开发的课程,对响应式开发有了一定的了解,完成了一个简单的小实战,登录界面的实现. 具体资源详见: https://download.csdn.net/download/ayanga ...

  8. Kivy App开发之登录界面Demo

    登录界面是根据个人设想简单设计的,效果如下: 代码如下,新建login.kv <LoginPage>:FloatLayout:canvas.before:Rectangle:size:se ...

  9. vbs获取群聊当前内容_通过VBS脚本批量检测服务器状态 - 易本地工作室-Ebend SoftwareNetwork Studio - 群发,采集,管理类软件定制开发服务【易本地工作室】...

    脚本名称:通过VBS脚本批量检测服务器状态 脚本语言:VBS 原创作者:易本地工作室 艾云超 官方网站:易本地工作室 授权状态:免费 功能说明:通过VBS脚本批量检测服务器状态,是否可以访问,可以自定 ...

  10. 聊聊软件登录界面的设计与交互

    前面说了一堆废话,想看代码的可直接看第二章. 版本记录 日期 备注 2020-06-13 初稿 零.前言 这个登录界面提取自最近正在做的一个项目,此项目曾被我自豪地称为是公司数采软件的颜值担当,虽然这 ...

最新文章

  1. mysql命令创建模式_mysql在命令行模式下创建数据库时要显式指定字符集
  2. 解决minikube启动时若干问题
  3. ios UIWebView调用本地html和javascript,并且和ios通讯
  4. win10开机慢怎么解决_细说Win10启动慢怎么办
  5. java编程笔记18 文件压缩与解压缩
  6. Map接口的实现类HashMap的操作
  7. java jna jni_JNA, Java Native开发利器
  8. 瑞芯微读取寄存器_瑞芯微Android软件中添加ALC5640 音频CODEC 的寄存器修改
  9. 巅峰阁批量卡android,卡iPhoneQQ在线
  10. 解决post提交时参数的中文乱码问题
  11. PID控制的现象与本质
  12. 从0开始的appium+Android+python自动抢红包世界生活
  13. python成功安装cartopy之后,调用crs时却出现错误,如何解决
  14. fusioncharts 嵌套饼图_【Tableau 图表】你是不是真的需要一个跑道图呢?
  15. html中写双柱状图,7.2 创建柱状图 - HTML5 Canvas 实战
  16. OpenStack配置Cinder出现“You must set cylinders.You can do this from the extra functions menu.”解决办法
  17. 904. 水果成篮(c++)
  18. dev c++播放音乐MP3
  19. Serverless开发实战——FASS
  20. 基础必学,挑灯夜战KVM虚拟化技术

热门文章

  1. 广州大学人工智能原理实验二:八数码问题
  2. win10系统托盘图标不见了_win10英特尔显卡设置图标不见了如何解决_win10英特尔核芯显卡托盘图标不见了怎么找回...
  3. AntDesign 表格设置背景色
  4. android root 的作用,安卓手机Root好不好?手机Root后有什么好处和影响?
  5. 差分技术:LVDS(低电压差分信号)
  6. u盘文件无法复制是什么原因?有什么解决方法
  7. 休闲娱乐 - 如何打坐
  8. Javamail配置阿里云邮箱发送邮件
  9. DNA损伤修复基因数据库
  10. 项目风险管理之风险分析