# app
**Repository Path**: bzz_3/ocr
## Basic Information
- **Project Name**: app
- **Description**: 手机app
- **Primary Language**: Android
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-07-14
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Handevices
#### 二航局手持移动端设备:calling:
人员信息录入 集成身份证读取以及指纹录入
#### 分支说明:speech_balloon:
* [分支说明](CHANGELOG.md)
#### 文档地址:arrow_upper_right:
* [文档地址](https://gitee.com/lovewmf/Handevices/wikis/pages)
#### 快速注解插件ButterKnife使用:loudspeaker:
再在build.gradle 中配置 添加上该依赖库并重新编译一下该项目
`compile 'com.jakewharton:butterknife:8.8.1'`
`在 setContentView(R.layout.activity_main) 或者 view = inflater.inflate(R.layout.fragment_submit, container, false)`
鼠标放在`R.layout.activity_main或R.layout.fragment_submit`右键——>generate然后点击然后点击 generate butterknife injections
如果是在Activity 中,要在OnCreate() 方法中加上这句话
`ButterKnife.bind(this);`
如果 是在 Fragment中,要在View.OnCreateView() 中一定要加上这句话
` ButterKnife.bind(this, rootView);`
#### Activity与Fragment生命周期示例:book:
Activity 生命周期示例
```java
/**
* **************************************************************
*
* @ProjectName: 4g
* @Package: com.zysoft.function
* @ClassName: ExampleActivity
* @Description: Activity 生命周期示例
* @Author: wmf
* @CreateDate: 2019/10/29 9:47
* @UpdateDate: 2019/10/29 9:47
* **************************************************************
*/
public class ExampleActivity extends Activity {
private static final String TAG = "The_life_cycle";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG,"onCreate");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG,"onRestart");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG,"onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG,"onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG,"onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG,"onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG,"onDestroy");
}
}
```
Fragment 生命周期示例
```java
/**
* **************************************************************
*
* @ProjectName: 4g
* @Package: com.zysoft.function
* @ClassName: ExampleFragment
* @Description: Fragment 生命周期示例
* @Author: wmf
* @CreateDate: 2019/10/29 9:54
* @UpdateDate: 2019/10/29 9:54
* **************************************************************
*/
public class ExampleFragment extends Fragment {
private static final String TAG = "The_life_cycle";
private Context mCtx;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mCtx = activity;
Log.e(TAG,"onAttach");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG,"onCreate");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.e(TAG,"onCreateView");
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.e(TAG,"onActivityCreated");
}
@Override
public void onStart() {
super.onStart();
Log.e(TAG,"onStart");
}
@Override
public void onResume() {
super.onResume();
Log.e(TAG,"onResume");
}
@Override
public void onPause() {
super.onPause();
Log.e(TAG,"onPause");
}
@Override
public void onStop() {
super.onStop();
Log.e(TAG,"onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.e(TAG,"onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e(TAG,"onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
Log.e(TAG,"onDetach");
}
}
```
#### OkHttp POST异步网络请求示例:book:
`OkHttp works on Android 5.0+ (API level 21+) and on Java 8+.`
OkHttp 表单数据POST异步上传
```java
/**
* ************************************************************
* @method OfflinePost
* @description 数据提交
* @date: 2019/10/22 15:41
* @param {String api 接口地址 HashMap 提交的数据}
* @author: wmf
* @return
* ************************************************************
*/
public void OfflinePost(String api, HashMap json){
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
FormBody.Builder builder = new FormBody.Builder();
for( Map.Entry key : json.entrySet()){
builder.add(key.getKey(),key.getValue().toString());
}
RequestBody body = builder.build();
Request request = new Request.Builder()
.url(api)//数据上传接口
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d("zysoft", "responseCode" +" " + response.code() + "responseMessage" + response.message());
mHandler.sendMessage(mHandler.obtainMessage(OFFILNE_TEAM_SUCCESSD, response.body().string()));
}
@Override
public void onFailure(Call call, IOException e) {
if(e instanceof SocketTimeoutException){
mHandler.sendMessage(mHandler.obtainMessage(OFFILNE_FAILE, "请求超时"));
}else {
mHandler.sendMessage(mHandler.obtainMessage(OFFILNE_FAILE, "连接异常"));
}
}
});
}
```
OkHttp 图片POST异步批量上传
```java
/**
* ************************************************************
* @method OfflineImg
* @description 图片批量上传
* @date: 2019/10/22 15:41
* @param {HashMap 提交的数据}
* @author: wmf
* @return
* ************************************************************
*/
public void OfflineImg(HashMap urlList){
final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
for( Map.Entry key : urlList.entrySet()){
builder.addFormDataPart("upFile","photo.png",RequestBody.create(MEDIA_TYPE_PNG,new File(key.getValue().toString())));
}
//额外参数
builder.addFormDataPart("attaId","0");
builder.addFormDataPart("commTreeId","0");
builder.addFormDataPart("attaDomain","penetrate");
builder.addFormDataPart("domainId","100");
MultipartBody body = builder.build();
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象
Request request = new Request.Builder()
.url(apiUtil.ImageUrl)//图片上传接口
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
mHandler.sendMessage(mHandler.obtainMessage(ImageUrl_SUCCEED, response.body().string()));
}
@Override
public void onFailure(Call call, IOException e) {
if(e instanceof SocketTimeoutException){
mHandler.sendMessage(mHandler.obtainMessage(ImageUrl_FAILE, "请求超时"));
}else {
mHandler.sendMessage(mHandler.obtainMessage(ImageUrl_FAILE,"连接异常"));
}
}
});
}
```
#### 日志记录:pencil2:
* #### 八月份:eight:
`2019.08.08 开始`
* #### 九月份:nine:
`2019.09.26 第一个版本上线 准备后续离线功能开发`
* #### 十月份:keycap_ten:
2019-10-08 星期二
* 创建退场人员字典项存储表
* 创建当前项目班组存储表
* 创建当前项目所需字典项存储表
* 创建离线人员数据录入存储表
* 创建离线添加班组存储表
* 创建离线退场人员数据存储表
2019-10-09 星期三
* 本地生成uuid与后台保持一致
* 离线人员数据录入insert数据表
* 离线添加班组数据insert数据表
* 离线退场人员数据insert数据表
* 更新相关数据字典项insert数据表
2019-10-10 星期四
* 删除离线添加班组的数据
* 删除离线添加的退场人员数据
* 删除离线添加的新增人员数据
* 全查离线添加的班组数据
* 全查离线退场人员数据
2019-10-11 星期五
* 查询单条离线新增的人员数据
* Bitmap转Base64字符串存入数据库
* Base64转图片并返回图片路径
```java
public HashMap GetFile(HashMap imgList){
HashMap img = new HashMap();
for( Map.Entry key : imgList.entrySet()){
img.put(key.getKey(),Base64File(key.getValue().toString(),Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+key.getKey()+".png"));
}
Log.e("zysoft_file",img.toString());
return img;
}
```
2019-10-12 星期六
* 手持设备新增app启动页
* 数据表主键id全部改为32位uuid
* 修改人员新增页面五张默认图片
* 新增同步离线数据字典项
2019-10-14 星期一
* 离线图片批量上传
* 离线数据提交(接口报500)
* 项目选择列表加入搜索功能
* 人员新增当选择有重大病史,需要输入病史说明
* 人员新增除身份证基本信息外,其他信息均可以不填写(部分代码重写)
2019-10-15 星期二
* 测试手持移动设备在线人员新增功能
* 测试手持设备在线人员退场
* 测试手持设备在线班组添加
* 离线图片批量上传替换人员数据对应字段
2019-10-16 星期三
* 人员退场加入搜索功能,支持通过身份证号/班组名称/人员姓名进行搜索
* 增加是否为班组长选项
* 增加是否为特种工选项
2019-10-17 星期四
* 测试人员退场搜索功能
* 修改离线上传人员新增数据所有图片为同一张图片的问题
* 离线录入人员图片不同数量测试图片批量上传
* 出生日期修改为2019-10-17(2019.10.17)
2019-10-18 星期五
* 测试离线图片批量上传
* 新增日期选择
* 重写离线数据提交方法
```java
/**
* ************************************************************
* @method OfflinePost
* @description 数据提交
* @date: 2019/10/22 15:41
* @param {String api 接口地址 HashMap 提交的数据}
* @author: wmf
* @return
* ************************************************************
*/
public void OfflinePost(String api, HashMap json){
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
FormBody.Builder builder = new FormBody.Builder();
for( Map.Entry key : json.entrySet()){
builder.add(key.getKey(),key.getValue().toString());
}
RequestBody body = builder.build();
Request request = new Request.Builder()
.url(api)//数据上传接口
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d("zysoft", "responseCode" +" " + response.code() + "responseMessage" + response.message());
mHandler.sendMessage(mHandler.obtainMessage(OFFILNE_TEAM_SUCCESSD, response.body().string()));
}
@Override
public void onFailure(Call call, IOException e) {
if(e instanceof SocketTimeoutException){
mHandler.sendMessage(mHandler.obtainMessage(OFFILNE_FAILE, "请求超时"));
}else {
mHandler.sendMessage(mHandler.obtainMessage(OFFILNE_FAILE, "连接异常"));
}
}
});
}
```
2019-10-21 星期一
* 离线班组添加与班组字典项数据合并
* 离线人员退场以及退场后数据变更
* 离线人员录入(除身份证基本信息外,其他信息非必需)
2019-10-22 星期二
* 离线班组添加测试
* 离线人员退场测试
* 离线人员录入测试
* PC端人员穿透测试
* 增加离线上传数据进度条
2019-10-23 星期三
* 测试现场人员穿透式管理系统
* 项目切换 双击切换项目无反应(中国交通建设集团有限公司根项目)
* 点击排班管理,页面无响应控制台查看接口报500错误
* 新增项目在项目切换里面没有找到
* 项目切换 无法显示项目
2019-10-24 星期四
* 根据目前需求 在线离线功能全部完成 待测试
* 人员退场增加请求参数 获取当前项目全部在岗人员
* 退场人员列表增加隔行换色 重写SimpleAdapter
```java
**
* **************************************************************
* @ProjectName: 4g手持机
* @Package: com.zysoft.function
* @ClassName: SpecialAdapter
* @Description: 重写SimpleAdapter ListView 隔行换色
* @Author: wmf
* @CreateDate: 2019/10/24 15:28
* @UpdateDate: 2019/10/24 15:28
* **************************************************************
*/
public class SpecialAdapter extends SimpleAdapter {
private int[] colors = new int[] { 0xfff8f8f8, 0xffffffff };
public SpecialAdapter(Context context, List
2019-10-25 星期五
* 测试PC端现场人员穿透式管理系统
* 培训管理——>培训课程——>培训明细——>新增人员(批量选择人员) 页面一直显示加载框 控制台查看接口报错500
* 首页——> 人员动态——> 最近出勤 ——> 人员头像下面显示为null
* 修改离线图片上传后 图片对应字段替换问题 i+=i修改为i=i+1
```java
try {
JSONObject offJson = new JSONObject(msg.obj.toString());
if(offJson.has("resultCode") && (offJson.getInt("resultCode") == 200)){
JSONArray imgList = new JSONArray(offJson.getString("resultData"));
int i = 0;
for( Map.Entry key : Uploadimg.entrySet()){
person.put(key.getKey(),imgList.getJSONObject(i).getString("attaUrl"));
i = i+1;
}
OfflinePost(apiUtil.SubmitData,person,3);
}else {
apiUtil.ShowToast(offJson.getString("resultMessage"),getActivity());
}
} catch (JSONException e) {
apiUtil.ShowToast("数据解析失败",getActivity());
e.printStackTrace();
}
```
* 测试发现离线数据上传进度条只有一条数据时显示0%的问题(待解决)
```java
int progress = mProgressBar.getProgress();
mProgressBar.setProgress(Integer.parseInt(msg.obj.toString()));
Log.e("zysoft","当前进度条位置:" + progress);
if (progress >= 100) {
mProgressBar.setProgress(0);
mHandler.removeMessages(MSG_PROGRESS_UPDATE);
alert.HideAlert();
apiUtil.ShowToast("离线数据上传完成",getActivity());
return;
}
```
2019-10-28 星期一
* 人员数据录入进场日期由获取系统时间增加点击可以选择日期
* 取消信息录入页面籍贯选项
* 测试PC端现场人员穿透式管理系统
2019-10-29 星期二
* 添加班组增加校验作业队
* 项目选择页面增加更新项目列表
* 与后台人员调试离线添加班组字段masterId:32位uuid
* 合并master分支
2019-10-30 星期三
* 手持设备打包apk
* 打包报错 Gadle版本过低升级本吧2.4.1——>4.6
`distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip`
* 修改build.gradle配置
* 新的依赖方式compile——>implementation
* provided——>compileOnly
```java
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation files('libs/A raBMApiDev.jar')
implementation files('libs/AraBMApiFp.jar')
implementation files('libs/jxl.jar')
compileOnly files('libs/classes.jar')
implementation files('libs/android-support-v4.jar')
implementation files('libs/HSProtAPI.jar')
```
* 本版升级4g手机含有中文名无法编译
* 修改4g手持手机——4g并修改相关配置文件
2019-10-31星期四
* Today
2019-11-01 星期五
* Today
* #### 问题记录
1. 进入数据录入页面闪退/数据提交——已解决
2. 离线数据上传失败——已解决
3. 添加班组界面显示作业队——已解决
4. 指纹仪打开失败——已解决
5. 记住密码——已解决
6. 手动输入——已解决
7. 扫描二维码无法下载app