私.01.资料
1、二维码 baidu 搜索"android 生成二维码"
1.1、Android进阶 - 二维码生成 - 简书.html(https://www.jianshu.com/p/b275e818de6a)
1.2、android两行代码生成二维码示例 - MyName_kk的博客 - CSDN博客.html(https://blog.csdn.net/myname_kk/article/details/77649477)
2、串口通信 baidu 搜索"android 串口编程"
2.1、Android串口通信(Android Studio) - 小王同志的博客 - CSDN博客.html(https://blog.csdn.net/qq_35952946/article/details/78863871)
2.2、Android 之 串口通信 - Mr.X - CSDN博客.html(https://blog.csdn.net/weixin_41046716/article/details/80137964)
2.3、怎么查看android 设备的串口_百度知道.html(https://zhidao.baidu.com/question/1669107706532261747.html)
ls /dev/tty *
2.4、Android串口操作,简化android-serialport-api的demo(附源码) - akunainiannian的专栏 - CSDN博客.html(https://blog.csdn.net/akunainiannian/article/details/8740007)
ZC: 标题是 简化,但是 我看着 怎么那么繁琐... 比直接使用android-serialport-api的例子烦多了... 而且这篇文章里面的源码 买也不便宜...
2.5、
(1)、android串口编程--------如何在window7系统上模拟串口调试 - biiliwuiid的博客 - CSDN博客.html(https://blog.csdn.net/biiliwuiid/article/details/55095378)
(2)、Android串口通信 - monkey1992 - 博客园.html(https://www.cnblogs.com/1992monkey/p/4542430.html)
(3)、android 串口编程 - pangfumin - 博客园.html(https://www.cnblogs.com/akunainiannian/articles/2990463.html)
2.6、虚拟机中无法连接上串口
Android 模拟器串口与PC虚拟串口通讯 - gd6321374的专栏 - CSDN博客.html(https://blog.csdn.net/gd6321374/article/details/74779770)
ZC:文章中说到“Android 5.0 以上的系统由于安全权限不一样,当运行SerialPort类的构造方法中下面代码,则会提示没有权限”
public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException { /* Check access permission */ if (!device.canRead() || !device.canWrite()) { try { /* Missing read/write permission, trying to chmod the file */ Process su; su = Runtime.getRuntime().exec("/system/bin/su"); String cmd = "chmod 666 " + device.getAbsolutePath() + "\n" + "exit\n"; su.getOutputStream().write(cmd.getBytes()); if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) { throw new SecurityException(); } } catch (Exception e) { e.printStackTrace(); throw new SecurityException(); } } ... ... }
ZC:我也注意到了这段代码,还把它独立拿出来测试:我使用 Android 6的SDK的虚拟机,发现 ttyS0/ttyS1/ttyS2判断出 它们是存在的,但是 都是不可读不可写的状态... 然后 我重新下载了 Android4.4的SDK,新建了Android4.4SDK的虚拟机,发现 打开串口是OK的了... ttyS0/ttyS1/ttyS2都不需要修改权限 直接就显示是可读可写的状态了,真是 系统版本差异?限制了?
ZC:我的CMD命令为“???\android-sdk\tools>emulator @z02 -scale 0.7 -qemu -serial COM1”,发现 ttyS2 对应的是 Win7x64中虚拟出来的COM1口...
ZC:我是这样测试 虚拟机中串口 和 Win7中串口的对应关系的(忘了是那篇文章中看到的了):(我这里是 Win7x64 虚拟出来 COM1和COM2是关联的) 用串口调试工具 连接COM2,然后在 adb shell 中输入如下命令:“echo "testMsg" > /dev/ttyS0”,“串口调试助手”里面没有信息打印出来的话 就是不对,再换一个 直到找到...
2.7、3.6.3 Emulator命令列启动参数 - 51CTO.COM.html(http://book.51cto.com/art/200912/173721.htm)
ZC:线程 更新 主界面 信息
(1)、线程及更新ui线程的简单理解 - 丽丽博客园 - 博客园.html(https://www.cnblogs.com/ll-ouyang/p/6481823.html)
(2)、子线程更新UI界面的2种方法 - 非余之渔 - 博客园.html(https://www.cnblogs.com/wdht/p/6137584.html)
(3)、子线程不能更新UI线程总结 - 这个时代,作为程序员可能要学习小程序 - CSDN博客.html(https://blog.csdn.net/androidstarjack/article/details/54238073)
3、TCP 客户端
baidu 搜索 "android TCP"
3.1、【Android Socket专题】: TCP通信客户端app的demo的实现 - shankezh的博客 - CSDN博客.html(https://blog.csdn.net/shankezh/article/details/70763579)
ZC:在子线程向界面发送接收到的信息的时候,用到了 intent与activity.context.sendBroadcast搭配的方式。查了一下 貌似是用于 activity之间传递消息,貌似还是进程间通信的手段(Android 三种sendBroadCast的方式对比 - sduliulun的专栏 - CSDN博客.html [ https://blog.csdn.net/sduliulun/article/details/50206155 ]),但是 是广播的 会不会效率不好?或者 ∵是广播的 只管广播发出去 能不能接收到 就不一定能保证了??
4、SQLite
4.1、导入导出命令
(1)、【Android】通过控制台将sqlite数据库文件导出 - hong2511的博客 - CSDN博客.html(https://blog.csdn.net/hong2511/article/details/80950703)
(2)、Android 数据库(SQLite)的导入导出命令 - Minor昔年 - CSDN博客.html(https://blog.csdn.net/u013836857/article/details/51684069)
4.2、sqlite 自动编号
SQLite数据库的id字段,怎么设置成从1开始自增?-CSDN论坛.html(https://bbs.csdn.net/topics/390739034)
SQLite中重置自动编号列的方法_SQLite_脚本之家.html(https://www.jb51.net/article/61575.htm)
4.3、
Android 一篇很啰嗦的SQLite入门知识总结 - AnliaLee的博客 - CSDN博客.html(https://blog.csdn.net/lly347705530/article/details/79125373)
Android 操作SQLite基本用法 - 荣耀王者 - 博客园.html(https://www.cnblogs.com/foxy/p/7725010.html)
SQLite的介绍 操作Sqlite 具体实例 - 无恨星晨 - 博客园.html(https://www.cnblogs.com/weixing/p/3232994.html)
4.4、20181019
(1)、SQLite 索引 _ 菜鸟教程.html(http://www.runoob.com/sqlite/sqlite-index.html)
(2)、sqlite时间段查询 - jiduoduo - 博客园.html(https://www.cnblogs.com/jiduoduo/p/6956217.html)
SQLite关于时间段查询的sql - - ITeye博客.html(http://alex-yang-xiansoftware-com.iteye.com/blog/1157214)
(3)、sqlite 获取当前时间 精确到毫秒 - nailsoul的专栏 - CSDN博客.html(https://blog.csdn.net/nailsoul/article/details/44596239)
Sqlite3中对于毫秒数和本地时间之间的转换以及时间相关操作_青春寂寞洒一地_新浪博客.html(http://blog.sina.com.cn/s/blog_648d306d0102wpcq.html)
(4)、sqlite3 存入当前时间。_百度知道.html(https://zhidao.baidu.com/question/456566237093587645.html)
sqlite3数据库写入时间操作 - 顺利的博客 - CSDN博客.html(https://blog.csdn.net/shunli008/article/details/78778606)
(5)、sqlite3查询表中最后一条记录 - xc889078的专栏 - CSDN博客.html(https://blog.csdn.net/xc889078/article/details/8793362)
5、baidu 搜索 "android imageview"
5.1、Android--UI之ImageView - 承香墨影 - 博客园.html(https://www.cnblogs.com/plokmju/p/android__ImageView.html)
6、LinearLayout
6.1、Android布局管理详解(1)—— LinearLayout 线性布局 - 瞳孔里的柔情 - 博客园.html(https://www.cnblogs.com/zzulihao/p/6535746.html)
6.2、【Android】Android中两种常用布局(LinearLayout和RelativeLayout) - widiot的博客 - CSDN博客.html(https://blog.csdn.net/white_idiot/article/details/54731668)
ZC:里面,将 <EditText/>的属性“android:layout_height="0dp"”,这样设置 表面看起来是 高度没有了,但是 实际上效果确是 <EditText/>的高 自适应在上下两个空间之间正好填满... 是这样子用的么?待测试...
ZC:不只是通过 属性layout_height 来设置的,是通过 属性layout_weight 来设置的,通过这个属性 可以实现类似 Delphi中熟悉的布局效果!layout_weight + layout_width/layout_height(设为0dp)
6.3、如何使LinearLayout可以滚动? - 问答 - 云+社区 - 腾讯云.html(https://cloud.tencent.com/developer/ask/33211)
ZC:这样弄:“<ScrollView> <LinearLayout ...>...</LinearLayout></ScrollView>”,用 <ScrollView/>包裹起来
ZC:横向的话,使用 <HorizontalScrollView/>包裹
7、获取时间 & 时间格式化输出(baidu 搜 "android 时间格式化")
7.1、android 时间获取以及时间格式化 - wdd1324的博客 - CSDN博客.html(https://blog.csdn.net/wdd1324/article/details/71169977)
long time=System.currentTimeMillis();//long now = android.os.SystemClock.uptimeMillis();
7.2、android 时间格式 各种转换 - 丶贰九 - 博客园.html(https://www.cnblogs.com/kevin-chen/p/7239650.html)
7.3、Android时间间隔 SystemClock.uptimeMillis 和 System.currentTimeMillis - 方耀宇的专栏 - CSDN博客.html(https://blog.csdn.net/fangyoayu2013/article/details/50786611)
SystemClock.uptimeMillis() // 从开机到现在的毫秒数(手机睡眠的时间不包括在内); // ZC: 类似于 Windows下的 GetTickCount()
System.currentTimeMillis() // 从1970年1月1日 UTC到现在的毫秒数;// 获取的时间,是可以通过System.setCurrentTimeMillis修改的,那么,在某些情况下,一但被修改,时间间隔就不准了。// ZC: 类似于 Windows下获取系统的时间,但是 时间被修改了的话 毫秒数也就变化了(时间变化了 毫秒数本来就应该变化的啊...)
8、开机自启动
baodu搜索"android 开机自启动"
8.1、android实现程序开机自启动 - jetereting - 博客园.html(https://www.cnblogs.com/jetereting/p/4572302.html)
8.2、Android应用如何开机自启动、自启动失败的原因、接收不到BOOT_COMPLETED广播可能的原因、adb命令发送BOOT_COMPLETED.html(http://www.trinea.cn/android/android-boot_completed-not-work/)
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -c android.intent.category.HOME -n package_name/class_name
9、android 判断网络是否可用 - 谢岩的博客 - CSDN博客.html(https://blog.csdn.net/bzlj2912009596/article/details/70882300)
ZC:(1)检查网络是否可用 (2)当网络不可用的时候,我们应该提供一个 界面让用户区设置网络连接 (3)判断网络类型的代码 (4)判断网络状态改变的代码,就是一个广播接收器
10、
10.1、红米Note4X,“...\platform-tools>adb pull "/sdcard/stu.db" "d:\zzz"”
我一直访问 SQLite的文件不成功,貌似是∵我没有root,在 pull的时候一直报错 “remote object "... ..." does not exist”(pull目录的时候 说 不存在,pull文件的时候也说 不存在)。在 “/data/data/com.testSQLite”和“/data/user/0/com.testSQLite/files” 里面 也不能执行 "ls"(权限)
万般无奈下,我把 stu.db创建到 sdcard目录中,这下可以做操作了(也能看到文件了,也能pull文件了...)
adb shell 中执行命令 "sqlite"/"sqlite1"/"sqlite2"/"sqlite3"/"sqlite4"/"sqlite5"/"sqlite6",都说没有这个命令,难道也是∵ 权限? 据说 sqlite是在 目录"/system/xbin"中(这个目录里面也看不了信息...)
ZC:机子里面没有 sqlite3程序?看到网上说 可以copy一个程序进去:
如果没有,可以通过360手机助手,从电脑上传入到system/xbin目录下面。 还有个坑,要确保sqlite3的版本跟手机版本匹配,可以去网上下载相应的版本。 从虚拟机导出的sqlite3文件,push到手机里,然后操作数据库发现不能用! 报:sh: /system/xbin/sqlite3: not executable: magic 7F45错误。 原来它是要使用跟你真机CPU型号相同的sqlite3文件,比如你的测试机是4.2版本,而你的studio的SDK是5.0以上版本,这样你从虚拟机里导出的sqlite3文件5.0版本,而你手机想对应的应该是4.0版本,那sqlite3文件会不匹配,所以报这个错误!只需要下载跟手机想符的sqlite3文件就可以了,5.0是一个分水岭!
10.2、使用root权限,虽然我的机子没有root,执行命令都不成功...:没进 shell时 "adb root",进了 shell 后 "su root"
10.3、使用 SQLiteDatabase.openOrCreateDatabase(...) 创建数据库(文件)时,如果是在 没有权限的目录下的话,会出错(貌似程序会崩溃退出)。使用 java.io.File::createNewFile() 来创建 数据库文件的话,也是一样的 程序会崩溃退出
10.4、SQLite 查看工具:(1)、火狐插件sqlite manager;(2)、调试SQLite数据库推荐使用SQLite Expert(Personal),简单易用;(3)、SQLite Browser;
11、EditText和ScrollView 滚动冲突
11.1、完美解决EditText和ScrollView的滚动冲突(上) - jhcelue - 博客园.html(https://www.cnblogs.com/jhcelue/p/7121965.html)
ZC:这个方式 并不正确,∵ 尝试下来没效果,基本代码:
public class MainActivity extends Activity implements View.OnTouchListener { ... ... @Override public boolean onTouch(View view, MotionEvent motionEvent) { //触摸的是EditText而且当前EditText能够滚动则将事件交给EditText处理。否则将事件交由其父类处理 if ( view.getId() == R.id.edtMsg_config ) { view.getParent().requestDisallowInterceptTouchEvent(true); // ZC: 相当于把手 从屏幕上移开(类似Winodws的鼠标放开事件) if (motionEvent.getAction() == MotionEvent.ACTION_UP) view.getParent().requestDisallowInterceptTouchEvent(false); } return false; } }
11.2、详解Android ScrollView嵌套EditText出现的滑动问题_Android_脚本之家.html(https://www.jb51.net/article/132092.htm)
ZC:该方式尝试下来,有效:(对 EditText进行设置,而不要对Activity进行设置)
FedtMsg_config.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 解决scrollView中嵌套EditText导致不能上下滑动的问题 v.getParent().requestDisallowInterceptTouchEvent(true); switch (event.getAction() & MotionEvent.ACTION_MASK) { // ZC: 相当于把手 从屏幕上移开(类似Winodws的鼠标放开事件) case MotionEvent.ACTION_UP: v.getParent().requestDisallowInterceptTouchEvent(false); break; } return false; } });
12、Adaptor
12.1、SimpleAdapter真不简单! - 文酱 - 博客园.html(https://www.cnblogs.com/wenjiang/p/3189082.html)
要构造一个SimpleAdapter,需要以下的参数: 1.Context context:上下文,这个是每个组件都需要的,它指明了SimpleAdapter关联的View的运行环境,也就是我们当前的Activity。 2.List<? extends Map<String, ?>> data:这是一个由Map组成的List,在该List中的每个条目对应ListView的一行,每一个Map中包含的就是所有在from参数中指定的key。 3.int resource:定义列表项的布局文件的资源ID,该资源文件至少应该包含在to参数中定义的ID。 4.String[] from:将被添加到Map映射上的key。 5.int[] to:将绑定数据的视图的ID跟from参数对应,这些被绑定的视图元素应该全是TextView。
从这里我们可以看到,要想使用ListView,我们应用程序的主界面必须包含ListView,然后ListView的内容可以自己定义,而不仅仅是TextView。 要想知道这是什么回事,我们就要知道SimpleAdapter是如何绑定数据到视图的,这个过程我们甚至可以自定义:
12.2、8.SQLite分页读取 - 天朝程序猿的专栏 - CSDN博客.html(https://blog.csdn.net/jabony/article/details/9203623)
12.3、9.SQLite分页表格 - 天朝程序猿的专栏 - CSDN博客.html(https://blog.csdn.net/jabony/article/details/9203635)
13、用Activity的onTouchEvent方法实现监听手指上下左右滑动 - 冰河世纪第二代 - CSDN博客.html(https://blog.csdn.net/qiantujava/article/details/9903891)
@Override public boolean onTouchEvent(MotionEvent _event) { //继承了Activity的onTouchEvent方法,直接监听点击事件 if(event.getAction() == MotionEvent.ACTION_DOWN) { //当手指按下的时候 x1 = event.getX(); y1 = event.getY(); } if(event.getAction() == MotionEvent.ACTION_UP) { //当手指离开的时候 x2 = event.getX(); y2 = event.getY(); if(y1 - y2 > 50) { Toast.makeText(MainActivity.this, "向上滑", Toast.LENGTH_SHORT).show(); } else if(y2 - y1 > 50) { Toast.makeText(MainActivity.this, "向下滑", Toast.LENGTH_SHORT).show(); } else if(x1 - x2 > 50) { Toast.makeText(MainActivity.this, "向左滑", Toast.LENGTH_SHORT).show(); } else if(x2 - x1 > 50) { Toast.makeText(MainActivity.this, "向右滑", Toast.LENGTH_SHORT).show(); } } return super.onTouchEvent(event); }
ZC:
double[] FtouchXs = {0,0.25, 0,0.25, 0.75,1, 0,0.25, 0.75,1}; double[] FtouchYs = {0.75,1, 0,0.25, 0.75,1, 0.75,1, 0,0.25}; int FtouchIdx = 0; void Create_Welcome() { ImageView imageview_welcome = (ImageView) this.findViewById(R.id.imageview_welcome); imageview_welcome.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View _v, MotionEvent _event) { int iW = _v.getWidth(); int iH = _v.getHeight(); if(_event.getAction() == MotionEvent.ACTION_DOWN) { //当手指按下的时候 float x = _event.getX(); float y = _event.getY(); FtouchIdx = 0; if ( (iW*FtouchXs[0] <= x)&&(x <= iW*FtouchXs[1]) && (iH*FtouchYs[0] <= y)&&(y <= iH*FtouchYs[1]) ) { Log.e("ACTION_DOWN", x+","+y); FtouchIdx = 1; } } else if(_event.getAction() == MotionEvent.ACTION_MOVE) { if ( (FtouchIdx == 1)||(FtouchIdx == 2) ||(FtouchIdx == 3)||(FtouchIdx == 4) ) { float x = _event.getX(); float y = _event.getY(); if ( (iW*FtouchXs[FtouchIdx*2] <= x)&&(x <= iW*FtouchXs[FtouchIdx*2+1]) && (iH*FtouchYs[FtouchIdx*2] <= y)&&(y <= iH*FtouchYs[FtouchIdx*2+1]) ) { Log.e("ACTION_MOVE", x+","+y); FtouchIdx ++; } } } else if(_event.getAction() == MotionEvent.ACTION_UP) { //当手指离开的时候 // float x = _event.getX(); // float y = _event.getY(); if (FtouchIdx == 5) { Log.e("ACTION_UP", "ACTION_UP"); Fvf01.setDisplayedChild(LY_IDX_CONFIG); } } return false; } }); ... ... }
14、Android按返回键退出应用时弹出对话框 - renwudao24的专栏 - CSDN博客.html(https://blog.csdn.net/renwudao24/article/details/44537835)
ZC:Override了onKeyDown之后,在函数里 不管返回true还是false,按 手机的回退键 都无法退出app了...
ZC:解决:Android onKeyDown监听返回键无效 - 星辰之力 - 博客园.html(https://www.cnblogs.com/zhujiabin/p/5918850.html):Override onBackPressed:
@Override public void onBackPressed() { super.onBackPressed(); }
15、baidu搜 “Android 串口 设置 停止位”
15.1、Android 串口设置校验位、速率、停止位等参数 - Cfan1236 - 博客园.html(https://www.cnblogs.com/rui1236/p/5988074.html) ZC:主看
15.2、Android 串口开发 支持N-8-1(数据位停止位校验方式) 设定 - sliencefun的博客 - CSDN博客.html(https://blog.csdn.net/sliencefun/article/details/79714591)
ZC:其实如果 使用 自己弄 NDK来变异使用JNI的话,都可以使用 串口的异步模式了,但是 我对此 不太了解 以后在说...
16、baidu搜 “Android jni exlipse”
16.1、Android Eclipse JNI开发示例 - chenjinlong126的博客 - CSDN博客.html(https://blog.csdn.net/chenjinlong126/article/details/78075143)
16.2、Android Studio开发JNI示例 - wzhseu的博客 - CSDN博客.html(https://blog.csdn.net/wzhseu/article/details/79683045)
17、baidu搜 “串口编程 232 485”
UART和RS232_RS485的关系,RS232与RS485编程 - DoubleLi - 博客园.html(https://www.cnblogs.com/lidabo/p/6307293.html)
18、CRC modbus
18.1、baidu搜"CRC校验 java"
(1)、Java Modbus CRC16校验 - koneloong - 博客园.html(https://www.cnblogs.com/koneloong/p/5218136.html)
ZC:代码 短小精悍。看到别的文章里面都是大段的代码,感觉有点虚,但是计算出来的结果确实是OK的...
(2)、JAVA CRC16校验工具 - xialong_927的博客 - CSDN博客.html(https://blog.csdn.net/xialong_927/article/details/80538127)
ZC:貌似 计算出来的结果有点不对啊... 高位byte 和 低位byte 是反的...
(3)、Java CRC16 校验代码 和 与之对应的C代码 - zhp的博客 - CSDN博客.html(https://blog.csdn.net/zhouhuiping007/article/details/78341329)
ZC:这个和上面 貌似 有点像,未仔细看...
18.2、baidu搜"CRC校验 在线"
(1)、On-line CRC calculation and free library.html(https://www.lammertbies.nl/comm/info/crc-calculation.html)
19、Android获取Mac地址-适配所有版本 - chaozhung的专栏 - CSDN博客.html(https://blog.csdn.net/chaozhung_no_l/article/details/78329371)
20、对话框
20.1、Android,对话框定时自动关闭的实现 - 技术荆棘路 - CSDN博客.html(https://blog.csdn.net/gavinming/article/details/6120051)
20.2、Android延迟自动关闭Dialog - 风轻云喏的专栏 - CSDN博客.html(https://blog.csdn.net/a550508153/article/details/50344623)
20.3、Android开发必知--几种不同对话框的实现 - codingblock - 博客园.html(https://www.cnblogs.com/codingblock/p/4721597.html)
20.4、AlertDialog、Dialog点击空白区域取消和不取消 - Thoms_L的博客 - CSDN博客.html(https://blog.csdn.net/Thoms_L/article/details/68064905)
21、MD5 (仅供参考)
21.1、MD5加密的简单java实现 - liu1782291245的博客 - CSDN博客.html(https://blog.csdn.net/liu1782291245/article/details/73467266)
21.2、标准JAVA MD5方法 - wangfei0904306的博客 - CSDN博客.html(https://blog.csdn.net/wangfei0904306/article/details/71565968)
22、
- runOnUiThread(new Runnable(){
- @Override
- public void run() {
- //更新UI
- imageView.setImageBitmap(bitmap);
- }
- });
23、百度 搜索 “android 4.4 打开 移动流量”
Android 打开关闭GPRS数据流量 - 筱丶新的博客 - CSDN博客.html(https://blog.csdn.net/qq_26981913/article/details/52314482)
android系统后台打开关闭4G网络-CSDN论坛.html(https://bbs.csdn.net/topics/391944690)
实现开启和关闭android移动网络 - fangzhibin4712的专栏 - CSDN博客.html(https://blog.csdn.net/fangzhibin4712/article/details/26563285/)
android 如何实现移动数据上网的开关?-CSDN问答.html(https://ask.csdn.net/questions/152)
50、遗留问题:
11.1、串口 关闭后,接收信息的线程不会退出 其实此时 串口可能并未真正关闭 要等到串口再次接收到消息的时候 才会真正的关闭 线程也在此时退出
51、