温馨提示:这篇文章已超过469天没有更新,请注意相关的内容是否还可用!
摘要:本教程介绍了如何使用Android Studio和Bmob后端云进行安卓应用开发。通过结合这两个工具,开发者可以实现注册、登录账号功能,密码找回机制,意见反馈系统以及数据可视化。该开发流程简化了开发过程,提高了开发效率,使得创建具有基本用户管理和数据展示功能的安卓应用变得更为容易。
目录
前言
概览
Bmob后端云介绍
Bmob后端云与Android Studio配置
一、Bmob后端云
二、Android Studio配置
工具类
一、User类
二、Suit类
三、Code类
实现类
一、登录代码
二、注册代码
三、找回密码代码
四、想法反馈代码
前言
本项目尚在开发阶段,主要针对的是安卓用户,通过查阅开发文档以及借鉴其他博主,由于是个人开发,可能会在逻辑会有所缺漏,欢迎各位安卓使用者与开发者进行内测并提交反馈意见给我,进行探讨顺便带带我;
本项目开发主题尚未决定,故本期向各位征集意见,可以通过安装该app进行注册登录,并写下您的想法提交反馈给我,后续将对收集的idea进行整合并决定方向,进行下一步的开发。
ps:保证无病毒与无信息泄露!!!欢迎大家参与
源代码:
链接:https://pan.baidu.com/s/10ECb54ne_9bubuCLWLB-Kw?pwd=v2sh
提取码:v2sh
安卓手机软件安装包:
链接:https://pan.baidu.com/s/1a2H5CKxKvtAjvnyOHvybUQ?pwd=np3w
提取码:np3w
概览
本期主要用到两个工具,Android Studio和Bmob后端云(后续介绍),在安卓客户端注册登陆并提交想法,最终在Bmob后端云中实现数据可视化,主要实现效果如下图所示
- Android Studio
- Bmob后端云
Android Studio在此不做介绍了,以下是对Bmob后端云的介绍
Bmob后端云介绍
本次采用Bmob后端云(Bmob后端云 (bmobapp.com))主要是其集成了数据库与服务器,对于很多Android/ios/wp个人移动开发者来说,开发一个具有网络功能的应用不是一件容易的事,不仅需要购买/租赁服务器,还必须掌握一门诸如Java/.net/php这类的服务器开发语言,每开发一款移动应用程序,就必须开发维护对应的服务器程序,鉴于此我目前水平有限,故先采用Bmob后端云进行开发,给应用软件快速添加一个安全灵活的后台管理系统,方便浏览终端保存的各种信息。
Bmob后端云与Android Studio配置
一、Bmob后端云
- 官网注册账号 (Bmob后端云 (bmobapp.com))
- 创建应用
- 创建表单,默认有一个_User表单(不用管),要新建一个User表单(名称要与后边安卓代码相同),数据将会在这个表单呈现
- 获取key秘钥,后边需要用
二、Android Studio配置
- AndroidManifest.xml:
1、添加网络权限
在上图位置添加下方代码以添加网络权限
2、连接Bmob
在上图位置添加下方代码,并将蓝色方框中的代码替换成红色箭头所指的自己代码的包名
- 在Activity中对Bmob进行初始化,在OnCreat方法中添加下方代码并将你的应用ID替换成上方Bmob配置时获取的key密钥
Bmob.initialize(this,"你的应用ID");
- 在build.gradle(Module:app)中添加包
implementation 'io.github.bmob:android-sdk:3.9.4' 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'
至此,配置已全部完成,接下来是进行界面设计与逻辑代码编写环节
工具类
一、User类
这个工具类的名称与前边在Bmob创建的表单名称相同,这个类继承于BmobObject,其属性相当于在表中的数据。
package com.example.application.tool; import java.io.Serializable; import cn.bmob.v3.BmobObject; public class User extends BmobObject implements Serializable { private String Acctount;//手机账户 private String Password;//密码 private String Context;//反馈内容 public String getAcctount() { return Acctount; } public void setAcctount(String acctount) { Acctount = acctount; } public String getPassword() { return Password; } public void setPassword(String password) { Password = password; } public String getContext() { return Context; } public void setContext(String context) { Context = context; } }
二、Suit类
这个类主要是号码检测(是否符合格式)与密码检测(至少包含3个字母)
package com.example.application.tool; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Suit { //手机号码检测 public static boolean PhoneSuit(String phone){ String ChineseMainland = "^((13[0-9])|(14[5,7,9])|(15[0-3,5-9])|(166)|(17[3,5,6,7,8])" + "|(18[0-9])|(19[8,9]))\d{8}$"; String HongKong = "^(5|6|8|9)\d{7}$"; Matcher C = Pattern.compile(ChineseMainland).matcher(phone); Matcher H = Pattern.compile(HongKong).matcher(phone); return C.matches() || H.matches(); } //密码检测(最少3个字母) public static boolean PasswordSuit(String password){ char[] s = password.toCharArray(); int count = 0 ; //检测所有的密码中有多少个字母 for (int i = 0;i = 'a' && s[i] = 'A' && s[i] = 3){ return true; }else { return false; } } }
三、Code类
这个类主要是生成验证码图片,由于目前短信验证在资源上有数量限制,故采用验证码图片进行验证,在实现类中通过创建类对象调用类方法实现对验证码图片的生成。
package com.example.application.tool; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import java.util.Random; public class Code { //随机数数组 private static final char[] CHARS = { '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; private static Code bmpCode; public static Code getInstance() { if(bmpCode == null) bmpCode = new Code(); return bmpCode; } //default settings //验证码默认随机数的个数 private static final int DEFAULT_CODE_LENGTH = 4; //默认字体大小 private static final int DEFAULT_FONT_SIZE = 25; //默认线条的条数 private static final int DEFAULT_LINE_NUMBER = 5; //padding值 private static final int BASE_PADDING_LEFT = 10, RANGE_PADDING_LEFT = 15, BASE_PADDING_TOP = 15, RANGE_PADDING_TOP = 20; //验证码的默认宽高 private static final int DEFAULT_WIDTH = 100, DEFAULT_HEIGHT = 40; //settings decided by the layout xml //canvas width and height private int width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT; //random word space and pading_top private int base_padding_left = BASE_PADDING_LEFT, range_padding_left = RANGE_PADDING_LEFT, base_padding_top = BASE_PADDING_TOP, range_padding_top = RANGE_PADDING_TOP; //number of chars, lines; font size private int codeLength = DEFAULT_CODE_LENGTH, line_number = DEFAULT_LINE_NUMBER, font_size = DEFAULT_FONT_SIZE; //variables private String code; private int padding_left, padding_top; private Random random = new Random(); //验证码图片 public Bitmap createBitmap() { padding_left = 0; Bitmap bp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bp); code = createCode(); c.drawColor(Color.WHITE); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setTextSize(font_size); //画验证码 for (int i = 0; i
实现类
一、登录代码
- 布局代码
- 实现代码
package com.example.application.activity; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.example.application.R; import com.example.application.tool.User; import java.util.List; import cn.bmob.v3.Bmob; import cn.bmob.v3.BmobQuery; import cn.bmob.v3.exception.BmobException; import cn.bmob.v3.listener.FindListener; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private EditText login_phone;//输入收集号码 private EditText login_password;//输入密码 private TextView login;//登陆按钮 private TextView login_lose;//忘记密码 private TextView login_resgister;//注册账号 private String phone; private String password; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Bmob.initialize(this,"ebb1d24c01600c55b1e8be7f2625d7a7"); initView(); } //初始化控件 private void initView() { login_phone = findViewById(R.id.Login_Phone); login_password = findViewById(R.id.Login_Password); login = findViewById(R.id.Login); login_lose = findViewById(R.id.Login_Lose); login_resgister = findViewById(R.id.Login_Resgister); //启动监听事件 login.setOnClickListener(this); login_lose.setOnClickListener(this); login_resgister.setOnClickListener(this); } //点击事件 @Override public void onClick(View view) { //添加意图,切换画面 Intent intent = new Intent(); //选择监听按钮触发机制 switch (view.getId()){ case R.id.Login: Getdata(); //没有输入号码、密码判断为空则弹窗提示 if (TextUtils.isEmpty(phone)){ Toast.makeText(this,"请输入手机号码",Toast.LENGTH_SHORT).show(); } else if (TextUtils.isEmpty(password)) { Toast.makeText(this,"请输入密码",Toast.LENGTH_SHORT).show(); } else { BmobQuery bmobQuery = new BmobQuery(); bmobQuery.findObjects(new FindListener() { @Override public void done(List object, BmobException e) { //如果没有异常的话进行查询列表账号 if(e == null){ int count = 0;//计数 //遍历 for (User user : object) { //查询到与客户端输入的账号一致 if (user.getAcctount().equals(phone)){ //查询到与客户端输入的密码一致 if (user.getPassword().equals(password)){ intent.setClass(getApplicationContext(),First_interface.class); //传递对象,方便主界面获取到用户信息 intent.putExtra("User",user); startActivity(intent); Toast.makeText(getApplicationContext(),"登陆成功",Toast.LENGTH_SHORT).show(); break; }else { Toast.makeText(getApplicationContext(),"密码错误",Toast.LENGTH_SHORT).show(); } } count++; } //遍历没有查询到,此时count++到object的数量 if (count >= object.size()){ Toast.makeText(getApplicationContext(),"账号不存在",Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(getApplicationContext(),"账号不存在",Toast.LENGTH_SHORT).show(); } } }); } break; case R.id.Login_Lose: intent.setClass(getApplicationContext(),Findpassword.class); startActivity(intent); break; case R.id.Login_Resgister: intent.setClass(getApplicationContext(),Resgister.class); startActivity(intent); break; } } //获取输入的号码与密码 public void Getdata(){ phone = login_phone.getText().toString().trim(); password = login_password.getText().toString().trim(); } }
二、注册代码
- 布局代码
- 实现代码
package com.example.application.activity; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.example.application.R; import com.example.application.tool.Code; import com.example.application.tool.Suit; import com.example.application.tool.User; import java.util.List; import cn.bmob.v3.Bmob; import cn.bmob.v3.BmobQuery; import cn.bmob.v3.exception.BmobException; import cn.bmob.v3.listener.FindListener; import cn.bmob.v3.listener.SaveListener; public class Resgister extends AppCompatActivity implements View.OnClickListener { private static final String TAG = null; private EditText register_phone;//获取注册的手机号码 private EditText register_password;//获取注册的密码 private EditText register_sms;//输入验证码 private TextView register;//注册 private TextView login_back;//返回登陆 private ImageView register_paint;//获取验证码 private String phone;//客户端输入的手机号码 private String passeword;//客户端输入的密码 private String sms;//客户端输入的验证码 private String realCode;//图形验证码 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_resgister); Bmob.initialize(this,"ebb1d24c01600c55b1e8be7f2625d7a7"); initView(); } //初始化控件 private void initView() { //获取控件变量 register_phone = findViewById(R.id.Register_Phone); register_password = findViewById(R.id.Register_Password); register_sms = findViewById(R.id.Register_SMS); register = findViewById(R.id.Register); login_back = findViewById(R.id.Login_Back); register_paint = findViewById(R.id.Register_Paint); //启动监听机制 //将验证码用图片的形式显示出来 register_paint.setImageBitmap(Code.getInstance().createBitmap()); realCode = Code.getInstance().getCode().toLowerCase(); register_paint.setOnClickListener(this); register.setOnClickListener(this); login_back.setOnClickListener(this); } //获取数据 public void Getdata(){ phone = register_phone.getText().toString().trim(); passeword = register_password.getText().toString().trim(); sms = register_sms.getText().toString().toLowerCase(); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.Register_Paint: register_paint.setImageBitmap(Code.getInstance().createBitmap()); realCode = Code.getInstance().getCode().toLowerCase(); Log.v(TAG,"realCode"+realCode); break; case R.id.Login_Back: finish(); break; case R.id.Register: Getdata(); //输入限制条件:不能为空、号码以及密码符合格式、密码数量限制条件:6到16 if (TextUtils.isEmpty(phone)){ Toast.makeText(getApplicationContext(),"请输入手机号码",Toast.LENGTH_SHORT).show(); } else if (TextUtils.isEmpty(passeword)) { Toast.makeText(getApplicationContext(),"请输入密码",Toast.LENGTH_SHORT).show(); } else if (TextUtils.isEmpty(sms)) { Toast.makeText(getApplicationContext(),"请输入验证码",Toast.LENGTH_SHORT).show(); } else if (Suit.PhoneSuit(phone.trim()) != true) { Toast.makeText(getApplicationContext(),"请输入正确的手机号码",Toast.LENGTH_SHORT).show(); } else if (Suit.PasswordSuit(passeword.trim()) != true) { Toast.makeText(getApplicationContext(),"密码最少包含3个字母",Toast.LENGTH_SHORT).show(); } else if (passeword.length() 16) { Toast.makeText(getApplicationContext(),"密码不得多于16位数",Toast.LENGTH_SHORT).show(); }else { BmobQuery bmobQuery = new BmobQuery(); bmobQuery.findObjects(new FindListener() { @Override public void done(List object, BmobException e) { if (e == null){ int count = 0;//判断是否查询到尾--遍历 //查询判断用户是否已经存在 for (User user : object){ if (user.getAcctount().equals(phone)){ register_phone.setText(""); Toast.makeText(getApplicationContext(),"该用户已经注册过",Toast.LENGTH_SHORT).show(); finish(); break; } count++; } //查询到尾没有 if (count == object.size()){ //判断验证码是否正确 if (sms.equals(realCode)) { Toast.makeText(getApplicationContext(), "验证码正确", Toast.LENGTH_SHORT).show(); //将用户信息存入bmob云端 final User user = new User(); user.setAcctount(phone); user.setPassword(passeword); user.save(new SaveListener() { @Override public void done(String s, BmobException e) { if (e == null){ Toast.makeText(getApplicationContext(),"注册成功",Toast.LENGTH_SHORT).show(); finish(); }else { Toast.makeText(getApplicationContext(),"注册失败",Toast.LENGTH_SHORT).show(); } } }); } else { register_sms.setText(""); Toast.makeText(getApplicationContext(), "验证码错误", Toast.LENGTH_SHORT).show(); } } }else { Toast.makeText(Resgister.this, "该用户不存在", Toast.LENGTH_SHORT).show(); } } }); } break; } } }
三、找回密码代码
- 布局代码
- 实现代码
package com.example.application.activity; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.example.application.R; import com.example.application.tool.Code; import com.example.application.tool.Suit; import com.example.application.tool.User; import java.util.List; import cn.bmob.v3.Bmob; import cn.bmob.v3.BmobQuery; import cn.bmob.v3.exception.BmobException; import cn.bmob.v3.listener.FindListener; import cn.bmob.v3.listener.UpdateListener; public class Findpassword extends AppCompatActivity implements View.OnClickListener { private static final String TAG = null; private EditText find_phone;//手机号码 private EditText find_sms;//验证码 private EditText find_password;//重设密码 private ImageView find_image;//验证码图片 private TextView findword;//完成 private TextView login_go;//去登陆 private String realCode; private String phone; private String sms; private String password; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_findpassword); Bmob.initialize(this,"ebb1d24c01600c55b1e8be7f2625d7a7"); initView(); } //初始化控件 private void initView() { //控件变量 find_phone = findViewById(R.id.Find_Phone); find_sms = findViewById(R.id.Find_SMS); find_password = findViewById(R.id.Find_Password); find_image = findViewById(R.id.Find_Image); findword = findViewById(R.id.Findword); login_go = findViewById(R.id.Login_Go); //监听机制 find_image.setImageBitmap(Code.getInstance().createBitmap()); realCode = Code.getInstance().getCode().toLowerCase(); find_image.setOnClickListener(this); findword.setOnClickListener(this); login_go.setOnClickListener(this); } @Override public void onClick(View view) { Intent intent = new Intent(); switch (view.getId()){ case R.id.Find_Image: find_image.setImageBitmap(Code.getInstance().createBitmap()); realCode = Code.getInstance().getCode().toLowerCase(); Log.v(TAG,"realCode"+realCode); break; case R.id.Findword: Getdata(); //判断不能为空 if (TextUtils.isEmpty(phone)){ Toast.makeText(getApplicationContext(),"请输入手机号码",Toast.LENGTH_SHORT).show(); } else if (TextUtils.isEmpty(password)) { Toast.makeText(getApplicationContext(),"请输入密码",Toast.LENGTH_SHORT).show(); } else if (TextUtils.isEmpty(sms)) { Toast.makeText(getApplicationContext(),"请输入验证码",Toast.LENGTH_SHORT).show(); } else if (Suit.PhoneSuit(phone.trim()) != true) { Toast.makeText(getApplicationContext(),"请输入正确的手机号码",Toast.LENGTH_SHORT).show(); } else if (Suit.PasswordSuit(password.trim()) != true) { Toast.makeText(getApplicationContext(),"密码最少包含3个字母",Toast.LENGTH_SHORT).show(); } else if (password.length() 16) { Toast.makeText(getApplicationContext(), "密码不得多于16位数", Toast.LENGTH_SHORT).show(); }else { BmobQuery bmobQuery = new BmobQuery(); bmobQuery.findObjects(new FindListener() { @Override public void done(List object, BmobException e) { if (e == null){ int count = 0;//判断是否查询到尾--遍历 //查询判断用户是否已经存在 for (User user : object){ if (user.getAcctount().equals(phone)){ Toast.makeText(getApplicationContext(),"该用户存在",Toast.LENGTH_SHORT).show(); //判断验证码是否正确 if (sms.equals(realCode)) { //云端数据更新 User user1 = new User(); user1.setPassword(password); user1.update(user.getObjectId(), new UpdateListener() { @Override public void done(BmobException e) { if (e == null) { Toast.makeText(getApplicationContext(),"密码修改成功",Toast.LENGTH_SHORT).show(); }else { Toast.makeText(getApplicationContext(),"修改失败"+"\n"+"错误代码:"+e.getErrorCode(),Toast.LENGTH_LONG).show(); } } }); finish(); break; }else { find_sms.setText(""); Toast.makeText(getApplicationContext(), "验证码错误", Toast.LENGTH_SHORT).show(); } } count++; } //查询到尾没有 if (count >= object.size()){ Toast.makeText(getApplicationContext(),"该用户不存在",Toast.LENGTH_SHORT).show(); } }else { Toast.makeText(getApplicationContext(),"该用户不存在",Toast.LENGTH_SHORT).show(); } } }); } break; case R.id.Login_Go: finish(); break; } } //获取输入的数据 private void Getdata() { phone = find_phone.getText().toString().trim(); sms = find_sms.getText().toString().toLowerCase(); password = find_password.getText().toString().trim(); } }
四、想法反馈代码
- 布局代码
- 实现代码
package com.example.application.activity; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.example.application.R; import com.example.application.tool.User; import java.util.List; import cn.bmob.v3.Bmob; import cn.bmob.v3.BmobQuery; import cn.bmob.v3.exception.BmobException; import cn.bmob.v3.listener.FindListener; import cn.bmob.v3.listener.SaveListener; import cn.bmob.v3.listener.UpdateListener; public class First_interface extends AppCompatActivity implements View.OnClickListener { private EditText idea;//编辑框 private Button submit;//提交按钮 private String context;//编辑框内容 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first_interface); Bmob.initialize(this,"ebb1d24c01600c55b1e8be7f2625d7a7"); initView(); } //初始化控件 private void initView() { //定义控件 idea = findViewById(R.id.Idea); submit = findViewById(R.id.submit); //监听 submit.setOnClickListener(this); } public void Getdata(){ context = idea.getText().toString().trim(); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.submit: Getdata(); //传递对象 Intent intent = getIntent(); User user = (User) intent.getSerializableExtra("User"); BmobQuery bmobQuery = new BmobQuery(); bmobQuery.findObjects(new FindListener() { @Override public void done(List list, BmobException e) { if(e == null){ System.out.println("1"); for (User user1 : list) { //查询到一样 if(user.getAcctount().equals(user1.getAcctount())){ //向云端提交数据 user1.setContext(context); user1.update(user1.getObjectId(), new UpdateListener() { @Override public void done(BmobException e) { if (e == null){ Toast.makeText(First_interface.this, "提交成功", Toast.LENGTH_SHORT).show(); }else { Toast.makeText(First_interface.this, "提交失败", Toast.LENGTH_SHORT).show(); } } }); break; } } } } }); break; } } }
至此,本期项目已经全部实现,尚有不足之处,后续将继续完善补充,欢迎各位下载试玩!
- 实现代码
- 布局代码
- 实现代码
- 布局代码
- 实现代码
- 布局代码
- 实现代码
- 布局代码
- 在build.gradle(Module:app)中添加包
- 在Activity中对Bmob进行初始化,在OnCreat方法中添加下方代码并将你的应用ID替换成上方Bmob配置时获取的key密钥
- AndroidManifest.xml:
- 获取key秘钥,后边需要用
- 创建表单,默认有一个_User表单(不用管),要新建一个User表单(名称要与后边安卓代码相同),数据将会在这个表单呈现
- 创建应用
- 官网注册账号 (Bmob后端云 (bmobapp.com))
- Bmob后端云
还没有评论,来说两句吧...