基于android的一氧化碳检测系统



目录

  • 一、项目简介
  • 二、系统功能结构图
  • 三、系统核心功能模块部分截图
  • 2.1 信息展示界面
  • 2.2监测界面
  • 2.3监测提醒界面
  • 三、部分核心代码
  • 4.1 登录部分
  • 4.2注册部分
  • 四、论文目录
  • 获取源码或论文


一、项目简介

本论文首先对基于Android的一氧化碳监测系统进行了需求分析,从系统的建设目标、开发环境、设计流程、功能构建等几个方面进行系统的总体设计,使用Java语言设计了基于Android的一氧化碳监测系统软件,主要完成了指标监测、居民管理、报警提示、数据推送等各项功能的设计,实现对一氧化碳监测系统展示。通过对系统的各项功能进行测试,测试结果证明本文所开发的系统能够实现界面友好、功能完善,具备较高的使用价值,拥有庞大的潜在用户群体和较广阔的应用前景。

二、系统功能结构图

android毕业设计源码 安卓毕业设计项目_android studio

三、系统核心功能模块部分截图

2.1 信息展示界面

用户想要使用本一氧化碳监测系统展示客户端,首先需要打开软件,就可以获得本一氧化碳监测系统的登录页面,信息展示效果图如图5-1所示。

android毕业设计源码 安卓毕业设计项目_Text_02

2.2监测界面

在监测界面中,将实时展示各个居民用户的监测结果,包含表格展示和图形展示,如图5-2所示。

android毕业设计源码 安卓毕业设计项目_课程设计_03

android毕业设计源码 安卓毕业设计项目_Text_04

2.3监测提醒界面

如果有用户的监测指标超标,将在APP中标红提示,并且发送短信提示,如图5-3所示。

android毕业设计源码 安卓毕业设计项目_android studio_05

android毕业设计源码 安卓毕业设计项目_android_06

三、部分核心代码

4.1 登录部分

package com.zdh.comonitotsys.ui;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import com.zdh.comonitotsys.R;
import com.zdh.comonitotsys.bean.User;
import com.zdh.comonitotsys.utils.Util;

import java.util.List;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import cn.bmob.v3.BmobUser;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.SaveListener;

public class LoginActivity extends AppCompatActivity implements View.OnClickListener {

    private Button mBtnLogin;
    private TextView mTvSignUp;
    private EditText mEtAccount;
    private EditText mEtPassword;
    private ImageView mIvAccountCleanIcon;
    private ImageView mIvPasswordSwitchIcon;
    private boolean mPasswordShow;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_activity);
        initView();
    }

    private void initView() {
        mBtnLogin = findViewById(R.id.btn_login);
        mTvSignUp = findViewById(R.id.tv_signup);
        mBtnLogin.setOnClickListener(this);
        mTvSignUp.setOnClickListener(this);
        mEtAccount = findViewById(R.id.login_account);
        mEtPassword = findViewById(R.id.login_password);
        mIvAccountCleanIcon = findViewById(R.id.account_clear_icon);
        mIvPasswordSwitchIcon = findViewById(R.id.iv_swich_passwrod);
        mIvAccountCleanIcon.setOnClickListener(this);
        mIvPasswordSwitchIcon.setOnClickListener(this);
    }

    @SuppressLint("NonConstantResourceId")
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_login:
                login();
                break;
            case R.id.tv_signup:
                Intent intent = new Intent(LoginActivity.this, SignUpActivity.class);
                startActivity(intent);
                finish();
                break;
            case R.id.account_clear_icon:
                mEtAccount.setText("");
                break;
            case R.id.iv_swich_passwrod:
                if (mPasswordShow) {
                    mPasswordShow = false;
                    mIvPasswordSwitchIcon.setImageResource(R.mipmap.show_psw);
                    mEtPassword.setTransformationMethod(HideReturnsTransformationMethod.getInstance());

                } else {
                    mPasswordShow = true;
                    mIvPasswordSwitchIcon.setImageResource(R.mipmap.show_psw_press);
                    mEtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
                }
                break;
            default:
                break;
        }
    }

    private void login() {
        String account = mEtAccount.getText().toString();
        if (TextUtils.isEmpty(account)) {
            Util.showMessage(this,"请输入账号!");
            return;
        }
        String password = mEtPassword.getText().toString();
        if (TextUtils.isEmpty(password)) {
            Util.showMessage(this,"请输入密码!");
            return;
        }

        User user = new User();
        user.setUsername(account);
        user.setPassword(password);
        mBtnLogin.setText("登陆中...");
        mBtnLogin.setEnabled(false);
        user.login(new SaveListener<User>() {
            @Override
            public void done(User bmobUser, BmobException e) {
                mBtnLogin.setText("登陆");
                mBtnLogin.setEnabled(true);
                if (e == null) {
                    User user = BmobUser.getCurrentUser(User.class);
                    Util.showMessage(LoginActivity.this,"登录成功:" + user.getUsername());
                    startActivity(new Intent(LoginActivity.this, UserCoDataActivity.class));
                    finish();
                } else {
                    Util.showMessage(LoginActivity.this,"登录失败:" + e.getMessage());
                }
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        //requestPermissions();
    }

    public void requestPermissions() {
        XXPermissions.with(this)
                // 申请通知栏权限
                .permission(Permission.NOTIFICATION_SERVICE)
                .permission(Permission.READ_PHONE_STATE)
                .permission(Permission.WRITE_EXTERNAL_STORAGE)
                .permission(Permission.READ_EXTERNAL_STORAGE)
                .permission(Permission.NOTIFICATION_SERVICE)
                .permission(Permission.SYSTEM_ALERT_WINDOW)
                .request(new OnPermissionCallback() {

                    @Override
                    public void onGranted(List<String> permissions, boolean all) {
                        if (all) {
                            Util.showMessage(LoginActivity.this,"获取权限成功");
                        } else {
                            Util.showMessage(LoginActivity.this,"获取部分权限成功,但部分权限未正常授予");
                        }
                    }

                    @Override
                    public void onDenied(List<String> permissions, boolean never) {
                        if (never) {
                            Util.showMessage(LoginActivity.this,"被永久拒绝授权,请手动授予文件读写和悬浮窗权限");
                            // 如果是被永久拒绝就跳转到应用权限系统设置页面
                            XXPermissions.startPermissionActivity(LoginActivity.this, permissions);
                        } else {
                            Util.showMessage(LoginActivity.this,"获取文件读写和悬浮窗权限失败");
                        }
                    }
                });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == XXPermissions.REQUEST_CODE) {
            if (XXPermissions.isGrantedPermission(this, Permission.SYSTEM_ALERT_WINDOW)) {
                Util.showMessage(this,"用户已经在权限设置页授予了悬浮窗权限");
            } else {
                Util.showMessage(this,"用户没有在权限设置页授予权限");
            }
        }
    }
}

4.2注册部分

package com.zdh.comonitotsys.ui;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;

import com.zdh.comonitotsys.R;
import com.zdh.comonitotsys.bean.User;
import com.zdh.comonitotsys.utils.CountDownTimeUtil;
import com.zdh.comonitotsys.utils.Util;

import androidx.appcompat.app.AppCompatActivity;
import cn.bmob.v3.BmobSMS;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.QueryListener;
import cn.bmob.v3.listener.SaveListener;
import cn.bmob.v3.listener.UpdateListener;

public class SignUpActivity extends AppCompatActivity implements View.OnClickListener{

    private static final String TAG = SignUpActivity.class.getSimpleName();

    private EditText mEtAccount;
    private EditText mEtPassword;
    private EditText mEtConfirmPassword;
    private User.Role mSelectedRole;
    private EditText mEtBuildingNum;
    private EditText mEtRoomNum;
    private EditText mEtPhone;
    private EditText mEtVerifyCode;
    private Button mBtnGetVerifyCode;
    private CountDownTimeUtil mCountDownTimeUtil;
    private String mAccount;
    private String mPassword;
    private String mConfirmPassword;
    private String mBuildingNum;
    private String mRoomNum;
    private String mPhone;
    private String mVerifyCode;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.signup_activity);
        initView();
    }

    private void initView() {
        Button mBtnSubmit = findViewById(R.id.btn_signupAndLogin);
        mBtnGetVerifyCode = findViewById(R.id.get_verify_code);
        mBtnSubmit.setOnClickListener(this);
        mBtnGetVerifyCode.setOnClickListener(this);
        mEtAccount = findViewById(R.id.signup_account);
        mEtPassword = findViewById(R.id.signup_password);
        mEtConfirmPassword = findViewById(R.id.signup_confirm_password);
        mEtBuildingNum = findViewById(R.id.building_number);
        mEtRoomNum = findViewById(R.id.room_number);
        mEtPhone = findViewById(R.id.phone);
        mEtVerifyCode = findViewById(R.id.verify_code);
        Spinner mRoleSpinner = findViewById(R.id.account_roles);
        mRoleSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                //String[] roles = getResources().getStringArray(R.array.account_roles);
                //Toast.makeText(SignUpActivity.this, "你点击的是:"+roles[position], Toast.LENGTH_LONG).show();
                switch (position) {
                    case 0:
                        mSelectedRole = User.Role.RESIDENT;
                        mEtBuildingNum.setVisibility(View.VISIBLE);
                        mEtRoomNum.setVisibility(View.VISIBLE);
                        break;
                    case 1:
                        mSelectedRole = User.Role.ASSISTANT;
                        mEtBuildingNum.setVisibility(View.VISIBLE);
                        mEtRoomNum.setVisibility(View.VISIBLE);
                        break;
                    case 2:
                        mSelectedRole = User.Role.ADMINISTRATOR;
                        mEtBuildingNum.setVisibility(View.GONE);
                        mEtRoomNum.setVisibility(View.GONE);
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
    }

    @SuppressLint("NonConstantResourceId")
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_signupAndLogin:
                signUpAndLogin();
                break;
            case R.id.get_verify_code:
                getVerifyCode();
                break;
            default:
                break;
        }
    }

    private void getVerifyCode() {
        if(!checkUserInputInfo()){
            return;
        }
        mBtnGetVerifyCode.setText("注册中...");
        mBtnGetVerifyCode.setEnabled(false);
        BmobSMS.requestSMSCode(mPhone, "VerifyCode", new QueryListener<Integer>() {
            @Override
            public void done(Integer smsId, BmobException e) {
                mBtnGetVerifyCode.setText("注册");
                mBtnGetVerifyCode.setEnabled(true);
                if (e == null) {
                    Util.showMessage(SignUpActivity.this,"发送验证码成功,短信ID:" + smsId + "\n");
                    mCountDownTimeUtil = new CountDownTimeUtil(mBtnGetVerifyCode);
                    mCountDownTimeUtil.runTimer();
                } else {
                    Util.showMessage(SignUpActivity.this,"发送验证码失败:" + e.getErrorCode() + "-" + e.getMessage() + "\n");
                    Log.d(TAG, "requestSMSCode: errorCode =  " + e.getErrorCode() + ", errorMessage = " + e.getMessage());
                }
            }
        });
    }

    private void signUpAndLogin() {
        if(!checkUserInputInfo()){
            return;
        }
        mVerifyCode = mEtVerifyCode.getText().toString();
        if (TextUtils.isEmpty(mVerifyCode)) {
            Util.showMessage(this,"请输入验证吗!");
            return;
        }
        User user = new User();
        user.setRole(mSelectedRole);
        user.setUsername(mAccount);
        user.setPassword(mPassword);
        user.setBuildingNum(mBuildingNum);
        user.setRoomNum(mRoomNum);
        user.setMobilePhoneNumber(mPhone);
        user.signOrLogin(mVerifyCode, new SaveListener<User>() {
            @Override
            public void done(User user, BmobException e) {
                if (e == null) {
                    Util.showMessage(SignUpActivity.this,"短信注册或登录成功:" + user.getUsername());
                    user.setMobilePhoneNumberVerified(true);
                    user.update(new UpdateListener() {
                        @Override
                        public void done(BmobException e) {
                            if (e == null) {
                                Log.d(TAG, "login and update phone number verified success!");
                            }
                        }
                    });
                    startActivity(new Intent(SignUpActivity.this, UserCoDataActivity.class));
                    finish();
                } else {
                    Util.showMessage(SignUpActivity.this,"短信注册或登录失败:" + e.getErrorCode() + "-" + e.getMessage() + "\n");
                    Log.d(TAG, "signOrLogin: errorCode =  " + e.getErrorCode() + ", errorMessage = " + e.getMessage());
                }
            }
        });
    }

    private boolean checkUserInputInfo() {
        mAccount = mEtAccount.getText().toString();
        if (TextUtils.isEmpty(mAccount)) {
            Util.showMessage(this,"请输入账号!");
            return false;
        }
        if ("000000".equals(mAccount)) {
            Util.showMessage(this,"账号不能为000000!");
            return false;
        }
        mPassword = mEtPassword.getText().toString();
        if (TextUtils.isEmpty(mPassword)) {
            Util.showMessage(this,"请输入密码!");
            return false;
        }
        mConfirmPassword = mEtConfirmPassword.getText().toString();
        if (TextUtils.isEmpty(mConfirmPassword)) {
            Util.showMessage(this,"请输入确认密码");
            return false;
        }
        if (!mPassword.equals(mConfirmPassword)) {
            Util.showMessage(this,"两次密码不一致,请重新输入!");
            return false;
        }
        mBuildingNum = mEtBuildingNum.getText().toString();
        String mRoomNum = mEtRoomNum.getText().toString();
        if (mSelectedRole != User.Role.ADMINISTRATOR) {
            if (TextUtils.isEmpty(mBuildingNum)) {
                Util.showMessage(this,"请输入楼号!");
                return false ;
            }
            if (TextUtils.isEmpty(mRoomNum)) {
                Util.showMessage(this,"请输入房间号!");
                return false;
            }
        }
        mPhone = mEtPhone.getText().toString();
        if (TextUtils.isEmpty(mPhone)) {
            Util.showMessage(this,"请输入手机号!");
            return false;
        }
        if (!isMobile(mPhone)) {
            Util.showMessage(this,"请输入正确手机号!");
            return false;
        }
        return true;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mCountDownTimeUtil != null) {
            mCountDownTimeUtil.cancel();
        }
    }

    /**
     * 验证手机格式
     */
    public static boolean isMobile(String number) {
    /*
    移动:134、135、136、137、138、139、150、151、152、157(TD)、158、159、178(新)、182、184、187、188
    联通:130、131、132、152、155、156、185、186
    电信:133、153、170、173、177、180、181、189、(1349卫通)
    总结起来就是第一位必定为1,第二位必定为3或5或8,其他位置的可以为0-9
    */
        String num = "[1][34578]\\d{9}";//"[1]"代表第1位为数字1,"[34578]"代表第二位可以为3、4、5、7、8中的一个,"\\d{9}"代表后面是可以是0~9的数字,有9位。
        if (TextUtils.isEmpty(number)) {
            return false;
        } else {
            //matches():字符串是否在给定的正则表达式匹配
            return number.matches(num);
        }
    }
}

四、论文目录

摘 要 1
ABSTRACT 2
目 录 3
第1章 绪论 5
1.1 选题背景 5
1.2 课题研究现状 6
1.3 研究内容 6
1.4 主要设计思路 6
第2章 开发环境介绍 8
2.1 Android系统的架构 8
2.1.1 应用程序 8
2.1.2 应用程序框架 8
2.1.3 系统运行库 9
2.1.4 Linux内核 10
2.2 安全权限机制 10
2.3 Android平台的搭建 10
2.4 JAVA简介 13
第3章 系统分析 15
3.1 系统可行性分析 15
3.1.1 技术可行性 15
3.1.2 操作可行性 15
3.1.3 经济可行性 15
3.2 功能需求 15
3.3 开发运行环境需求 16
3.4 性能需求 17
3.5 其它需求 17
第4章 系统总体设计 18
4.1 概述 18
4.2 设计原则 18
4.3 Android应用程序结构剖析 18
4.4 系统功能结构图 24
第5章 系统的实现 26
5.1 软件界面设计 26
5.2 信息展示界面 26
5.3监测界面 27
5.4监测提醒界面 28
第6章 系统的测试 30
6.1 测试方案设计 30
6.1.1 测试策略 30
6.1.2 测试安排 30
6.1.3 测试资源 30
6.2测试用例构建 31
6.2.1 测试用例编写约定 31
6.2.2 测试分析 31
总 结 32
参考文献 34