# Androd-BaseProject **Repository Path**: Lyken/androd-base-project ## Basic Information - **Project Name**: Androd-BaseProject - **Description**: 在做项目的时候,我发现很多项目都有共通的地方,比如一样的注册登录,调用Socket,调用蓝牙,连接串口,绘制图表,导出Excel等,本项目就是将这些比较常用的功能抽出为模块的形式,并在项目中做相应的调用。 - **Primary Language**: Java - **License**: EPL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-05-04 - **Last Updated**: 2023-05-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 安卓 - 基本项目 在做项目的时候,我发现很多项目都有共通的地方,比如一样的注册登录,调用Socket,调用蓝牙,连接串口,绘制图表,导出Excel等,本项目就是将这些比较常用的功能抽出为模块的形式,并在项目中做相应的调用。 ## 如何部署 理论上把我的项目fork下来就能用了 当前的环境是 Java 1.8,使用的安卓版本是27,就是安卓7.0 Gradle下不下来的话可以挂个梯子 然后在Android Studio的设置中修改 HTTP proxy ## 数据库 ### 新建实体类 使用比较简单,首先新建实体类,类名上添加@Entity,id上添加@Id就可以用了 ```java @Entity public class User { @Id String id; String email; String username; String password; Date regDate; } ``` ### 自动生成代码 点一下锤子按钮,即可将上面的类生成为下方的代码 需要修改`android.buildTypes.greendao.schemaVersion`,在app的build.gradle中 才能重新生成数据库,修改类后直接使用会报错 ```java @Entity public class User { @Id String id; String email; String username; String password; Date regDate; @Generated(hash = 737246809) public User(String id, String email, String username, String password, Date regDate) { this.id = id; this.email = email; this.username = username; this.password = password; this.regDate = regDate; } @Generated(hash = 586692638) public User() { } // 一些getset方法 } ``` 然后在Activity中使用 ```java devOpenHelper = new DaoMaster.DevOpenHelper(this, GlobalConfig.DB_NAME, null); daoMaster = new DaoMaster(devOpenHelper.getWritableDatabase()); daoSession = daoMaster.newSession(); ``` ```java UserDao userDao = daoSession.getUserDao(); ``` ```java // 少一点的时候可以这么操作 List users = userDao.loadAll(); for (User user:users){ if (user.getUsername().equals(username)){ return user; } } ``` [GreenDAO的GitHub地址](https://github.com/greenrobot/greenDAO) ## 蓝牙 具体代码在`com.leo.base_project.activity.module_Impl.bluImpl;` ### 检测蓝牙是否能打开 ```java private void initBlueTooth() { mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter == null) { UIUtils.toast("无法打开蓝牙"); } // 初始化连接 setupChat(); } ``` ### 获得蓝牙设备信息 ```java scanDevice() ``` 该方法会打开`DeviceScanActivty`,选择需要的蓝牙设备后使用`onActivityResult`回调 返回蓝牙设备的Mac地址和设备名称 将这些数据打包进自己的蓝牙设备信息类中 ```java public class BluDevice { @Id(autoincrement = true) Long id; // 设备名 String device_name; // 设备地址 String device_address; // 上次上线时间 Date onlineTime; // 上次下线时间 Date offlineTime; } ``` ### 尝试连接 随后点击按钮尝试连接 ```java private void setupChat() { if (blu_device != null) { if (mChatService != null) { mChatService.stop(); } mChatService = new BluetoothChatService(this, mHandler); // 1.获得蓝牙设备对象 BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(blu_device.getDevice_address()); // 2.连接 mChatService.connect(device); } } ``` 连接成功后界面会显示 连接成功... ### 发送数据 ```java mChatService.write(send); ``` ### 在handle中处理回调信息 上方三个case是状态回调,下方一个是数据读取回调 ```java private final Handler mHandler = new Handler() { @SuppressLint("SetTextI18n") @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_STATE_CHANGE: switch (msg.arg1) { case BluetoothChatService.STATE_CONNECTED: // 连接成功的状态 toast("连接成功..."); updateState("连接成功"); // 把当前的设备存到数据库里 saveDevice(true); break; case BluetoothChatService.STATE_CONNECTING: toast("连接中..."); updateState("连接中"); // 正在连接的状态 break; case BluetoothChatService.STATE_NONE: // 无连接状态 toast("无连接..."); updateState("无连接"); break; } break; //------------------------------------从设备获取数据--------------------------------- case MESSAGE_READ: //添加到buffer // readBuf.add()byte[]) msg.obj; // 收到一次信息,转换为byte数组 binding.edBluReceiveData.setText(""); byte[] obj = (byte[]) msg.obj; binding.edBluReceiveData.setText(new String(obj)); // 对收到的消息进行一定的处理 break; } } }; ``` ## Socket连接 具体实现在`com.leo.base_project.activity.module_Impl.socketImpl`中 我写的分为客户端和服务端两个,目前只能同时启动一个客户端和一个服务端 服务端只能接受一个客户端,用于点对点的传输,如果需要一对多在后续会进行修改 ### 新建socket客户端 首先新建一个handler,记住是android.os的handler不是log的 然后把这个handler传进去,后面也会写 ```java client = new SocketService(handler); ``` ### Handler状态 与蓝牙的状态类似 增加了一个错误反馈的状态 因为socket会遇到断开连接之类的问题,蓝牙不多 ```Java Handler handler = new Handler() { @Override public void handleMessage(@NonNull Message msg) { switch (msg.what) { case SocketService.CONNECTING: updateState("连接中"); break; case SocketService.CONNECTED: updateState("已连接"); break; case SocketService.CONNECT_ERR: updateState("错误: " + msg.obj.toString()); break; case SocketService.DISCONNECTED: updateState("断开连接"); break; case SocketService.RECEIVED_MSG: binding.receivedText.setText(""); binding.receivedText.setText(msg.obj.toString()); break; } } }; ``` ### 连接远程socket服务器 ``` client.connect(ip, port); ``` 理论上socket可以发送和接受,但是我在安卓上试了很久都不行 最后还是单独写了一个ServerSocket用来接受数据 ### 发送数据 ```java client.send(text); ``` 错误判断已经包装了,还想包装一下也可以 ### 监听数据 ``` client.startReceiving(port2); ``` ### 停止 这边是发个0作为停止标识符,也可以用别的,调一下这个 发送一个0,接受一个0就停止了 ``` client.disconnect(); ``` ## 折线图 ### 初始化 输入一个`ArrayList entries;` ```java chart = binding.lineChart; entries = new ArrayList<>(); utils = new LineChartModule(chart,entries,"测试",-1); ``` 第三行解释 ``` /* * 功能:调用方法,初始化折线图 * 输入:[lineChart] 折线图对象 * [data] 数组,需要提前初始化 * [tag] 标签,当前单线的标签 * [dataLimit] 当前折线图最多添加几个数据,-1为无限制 * 创建时间: 2021/9/1 9:08 * 创建者:Leo */ public LineChartModule(LineChart lineChart, ArrayList data, String tag, int dataLimit) ``` ### 添加限制线 ```java // float数值,标签,标签默认是显示在右上 LimitLine ll1 = utils.setLimitLine(10, "测试1"); LimitLine ll2 = utils.setLimitLine(-10, "测试2"); // 绑定限制线,true是绑在左轴上,false是右轴 utils.bindLimitLine(ll1,true); utils.bindLimitLine(ll2,true); ``` ### 设置y轴范围 Max,Min ``` utils.setRange(30,-30); ``` 添加数据 ``` utils.addData(new Entry(0,1)); utils.addData(new Entry(1,4)); utils.addData(new Entry(2,5)); utils.addData(new Entry(3,8)); ``` ## 表格