# 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> items, int resource, String[] from, int[] to) { super(context, items, resource, from, to); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); int colorPos = position % colors.length; view.setBackgroundColor(colors[colorPos]); return view; } } ``` * 测试PC端现场人员穿透式管理系统 * 测试人员退场(接口报错)
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