通达oa2011已经支持 指纹考勤机  但只限中控iclock660 这款2000大洋的型号

通过本文的开发接口,可以与任意一款指纹机集成, 需求指纹机管理软件能实时保存数据

我这里用的是 中控u160 指纹考勤机, 这款机器支持WIFI ,可以实现实时传输考勤数据,

特别指出的一点是这款机器的中控u160WIFI配置 容易出错的是 网线连接的ip网段 设置192.168.3.x

WIFI ip网段是在192.168.1.x   ,这样才能保证成功, 大多数都是错在这里

考勤机管理软件会生成一个 Access 数据库以保存信息,或其他数据库同理, 我们的目的就是用通达OA的

php连接此库,将信息同步到 OA考勤记录上, 本接口适用 通达oa2011 通达oa2010 ,通达oa早期版本未测试

代码中 将 通达oa的 attend_duty表 加了俩个字段 type和 update_time 自行添加或修改吧,

同步代码:

  1. <?
  2. include_once( "inc/td_core.php" );
  3. include_once( "inc/conn.php" );
  4. include_once( "inc/utility.php" );
  5. include_once( "inc/utility_all.php" );
  6.  
  7. $ACCESS_PATH="D:\Program Files\Att2008\att2000.mdb";
  8. $CUR_DATE = date( "Y-m-d", time( ) );
  9. $conn = new COM( "ADODB.Connection" );
  10. $connstr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=".realpath( "{$ACCESS_PATH}" );
  11. $conn->Open( $connstr );
  12. $rs = new COM( "ADODB.RecordSet" );
  13. $query = "select CHECKINOUT.USERID as USERID,CHECKINOUT.CHECKTIME as CHECKTIME ,USERINFO.name as name from CHECKINOUT,USERINFO where CHECKINOUT.USERID=USERINFO.USERID ";
  14. $rs->Open( $query, $conn, 1, 1 );
  15. $i=0;
  16. while ( !$rs->eof )
  17. {
  18.  
  19. $query1 = "SELECT USER_ID from USER where USER_NAME='".$rs->Fields("name")."'";
  20. $cursor1 = exequery( $connection, $query1 );
  21. if ( $ROW1 = mysql_fetch_array( $cursor1 ) )
  22. {
  23. $USER_ID = $ROW1['USER_ID'];
  24. //
  25. $CUR_DATE = date( "Y-m-d", time( ) );
  26. $CUR_TIME = $rs->Fields("checktime");
  27. $CUR_TIME=str_replace("上午","",$CUR_TIME);
  28. $CUR_TIME=str_replace("下午 12","12",$CUR_TIME);
  29. if((strpos($CUR_TIME,"下午")>-1))
  30. {
  31. //处理时间格式 删除上午 下午则加12小时
  32. $CUR_TIME=str_replace("下午","",$CUR_TIME);
  33. $CUR_TIME=strtotime($CUR_TIME)+43200;
  34. $CUR_TIME=date("Y-m-d H:i:s",$CUR_TIME+12);
  35. }
  36.  
  37. $update_time=date("Y-m-d H:i:s",time());
  38. $REGISTER_TYPE="2";
  39. $t=$_REQUEST['tcode'];
  40.  
  41. $query = "SELECT * from ATTEND_DUTY where USER_ID='".$USER_ID."' and to_days(REGISTER_TIME)=to_days('{$CUR_TIME}') order by id desc limit 1";
  42. $cursor = exequery( $connection, $query );
  43. if ( !( $ROW = mysql_fetch_array( $cursor ) ) )
  44. {
  45. $REGISTER_TYPE=1;
  46. $query = "insert into ATTEND_DUTY(USER_ID,REGISTER_TYPE,REGISTER_TIME,REGISTER_IP,type,UPDATE_TIME) values ('".$USER_ID."','{$REGISTER_TYPE}','{$CUR_TIME}','zk指纹考勤机','0','{$update_time}')";
  47. exequery( $connection, $query );
  48. $i++;
  49. }
  50. else
  51. {
  52. $REGISTER_TYPE=2;
  53.  
  54. if($ROW['REGISTER_TYPE']==1)
  55. {
  56. if( strtotime($CUR_TIME) > strtotime($ROW['REGISTER_TIME']) )
  57. $query = "insert into ATTEND_DUTY(USER_ID,REGISTER_TYPE,REGISTER_TIME,REGISTER_IP,type,UPDATE_TIME) values ('".$USER_ID."','{$REGISTER_TYPE}','{$CUR_TIME}','zk指纹考勤机','0','{$update_time}')";
  58. }
  59. else
  60. $query = "update ATTEND_DUTY set type='0',REGISTER_TIME='".$CUR_TIME."',REGISTER_IP='zk指纹考勤机',UPDATE_TIME='".$update_time."' where USER_ID='".$USER_ID."' and REGISTER_TYPE='{$REGISTER_TYPE}' and to_days(REGISTER_TIME)=to_days('{$CUR_TIME}')" ;
  61. exequery( $connection, $query );
  62. $i++;
  63. }
  64. }
  65.  
  66. $rs->MoveNext( );
  67. }
  68. echo "成功更新".($i)."条记录!";
  69. ?>

下面奉上 通达oa 定时执行代码
可以实现上午9点前每隔1分钟执行一次 同步程序, 9-17点每隔5分钟一次 5-6点 1分钟一次。
具体内容大家自己研究 不详细解释了
 webroot\ispirit\status_bar.php.

  1. <?php
  2. /*********************/
  3. /* */
  4. /* Version : 5.1.0 */
  5. /* Author : RM */
  6. /* Comment : 071223 */
  7. /* */
  8. /*********************/
  9.  
  10. include_once( "inc/auth.php" );
  11. include_once( "inc/utility_all.php" );
  12. include_once( "inc/td_core.php" );
  13. $query = "SELECT * from USER where USER_ID='".$LOGIN_USER_ID."'";
  14. $cursor = exequery( $connection, $query );
  15. if ( $ROW = mysql_fetch_array( $cursor ) )
  16. {
  17. $SMS_ON = $ROW['SMS_ON'];
  18. $CALL_SOUND = $ROW['CALL_SOUND'];
  19. $PWD = $ROW['PASSWORD'];
  20. $PWD = substr( md5( keyed_str( $PWD, "BLVY" ) ), 0, 16 );
  21. }
  22. $CHECK_SMS = 0;
  23. if ( find_id( $USER_FUNC_ID_STR, "42" ) )
  24. {
  25. $CHECK_SMS = 1;
  26. }
  27. else
  28. {
  29. $query = "select * from SMS2_PRIV";
  30. $cursor = exequery( $connection, $query );
  31. if ( $ROW = mysql_fetch_array( $cursor ) )
  32. {
  33. $SMS2_REMIND_PRIV = $ROW['SMS2_REMIND_PRIV'];
  34. }
  35. if ( find_id( $SMS2_REMIND_PRIV, $LOGIN_USER_ID ) )
  36. {
  37. $CHECK_SMS = 1;
  38. }
  39. }
  40. $NEW_SMS_HTML = "<a href='#' onclick='javascript:show_sms();' title='点击查看短信'><img src='/images/sms1.gif'border=0 height=10> 短信</a>";
  41. if ( $CALL_SOUND != "0" )
  42. {
  43. $NEW_SMS_SOUND_HTML = "<object id='sms_sound' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='/inc/swflash.cab' width='0' height='0'><param name='movie' value='/wav/".$CALL_SOUND.".swf'><param name=quality value=high><embed id='sms_sound' src='/wav/{$CALL_SOUND}.swf' width='0' height='0' quality='autohigh' wmode='opaque' type='application/x-shockwave-flash' plugspace='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash'></embed></object>";
  44. }
  45. else
  46. {
  47. $NEW_SMS_SOUND_HTML = "";
  48. }
  49. echo "\r\n<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\">\r\n<link rel=\"stylesheet\" type=\"text/css\" href=\"/theme/";
  50. echo $LOGIN_THEME;
  51. echo "/status_bar.css\">\r\n";
  52.  
  53. //echo "<meta http-equiv=refresh content=\"10\">";
  54.  
  55. echo "<title>状态栏</title>\r\n<script src=\"/inc/js/utility.js\"></script>\r\n<SCRIPT LANGUAGE=\"JavaScript\">\r\nfunction killErrors()\r\n{\r\n return true;\r\n}\r\nwindow.onerror = killErrors;\r\n\r\nvar ctroltime;\r\nvar checktime;\r\n\r\nfunction MyLoad()\r\n{\r\n setTimeout(\"online_mon()\",1000);\r\n clearTimeout(ctroltime);\r\n ctroltime=setTimeout(\"sms_mon()\",3000);\r\n setTimeout(\"email_mon()\",11000);\r\n";
  56. if ( $I_VER == "2" )
  57. {
  58. echo " window.external.OA_SMS(\"";
  59. echo $LOGIN_USER_NAME;
  60. echo "\",\"";
  61. echo $PWD;
  62. echo "\",\"NAME\");\r\n";
  63. }
  64. echo "}\r\n\r\nfunction online_mon(req)\r\n{\r\n if(isUndefined(req))\r\n {\r\n _get(\"../general/ipanel/user/user_count.php\",\"CHECK_SMS=";
  65. echo $CHECK_SMS;
  66. echo "\",online_mon);\r\n setTimeout(\"online_mon()\",";
  67. echo $ONLINE_REF_SEC * 1000;
  68. echo ");\r\n }\r\n else\r\n {\r\n var count = 0;\r\n if(req.status==200)\r\n count = isNaN(parseInt(req.responseText)) ? 0 : parseInt(req.responseText);\r\n \$(\"user_count1\").value=count;\r\n \$(\"user_count1\").size=(\$(\"user_count1\").value.length<3 ? 3 : \$(\"user_count1\").value.length);\r\n";
  69. if ( $I_VER == 2 )
  70. {
  71. echo " if(count == 0)\r\n {\r\n window.external.OA_SMS(\"\",\"\",\"RELOGIN\");\r\n }\r\n";
  72. }
  73. echo " }\r\n}\r\n\r\nfunction email_mon(req)\r\n{\r\n if(isUndefined(req))\r\n {\r\n _get(\"../general/status_bar/email_mon.php\",\"\",email_mon);\r\n setTimeout(\"email_mon()\",900000);\r\n }\r\n else if(req.status==200)\r\n {\r\n if(req.responseText==\"1\")\r\n \$(\"new_letter\").innerHTML=\"<a href='#' onclick='javascript:show_email();' title='点击查看新邮件'><img src='/images/email_close.gif' border='0' width='16' height='16' align='absMiddle'></a>&nbsp;\";\r\n else\r\n \$(\"new_letter\").innerHTML=\"\";\r\n }\r\n}\r\n\r\nvar sms_mon_ref = ";
  74. echo $SMS_REF_SEC * 1000;
  75. echo ";\r\nfunction sms_mon(req)\r\n{\r\n if(isUndefined(req))\r\n {\r\n clearTimeout(ctroltime);\r\n _get(\"../attachment/new_sms/";
  76. echo $LOGIN_UID;
  77. echo ".sms?now=\" + new Date().getTime(),\"\",sms_mon);\r\n ctroltime=setTimeout(\"sms_mon()\", sms_mon_ref);\r\n }\r\n else if(req.status==200)\r\n {\r\n if(req.responseText==\"1\")\r\n {\r\n \$(\"new_sms\").innerHTML=\"";
  78. echo $NEW_SMS_HTML;
  79. echo "\";\r\n \$(\"new_sms_sound\").innerHTML=\"";
  80. echo $NEW_SMS_SOUND_HTML;
  81. echo "\";\r\n";
  82. if ( $I_VER == "2" )
  83. {
  84. echo " window.external.OA_SMS(\"\",\"1\",\"OPEN\");\r\n";
  85. }
  86. else if ( $SMS_ON == 1 )
  87. {
  88. echo " show_sms();\r\n";
  89. }
  90. echo " }\r\n else\r\n {\r\n \t set_no_sms()\r\n }\r\n }\r\n}\r\n\r\nfunction set_sms_ref()\r\n{\r\n sms_mon_ref = ";
  91. echo $SMS_REF_SEC * 10 * 1000;
  92. echo ";\r\n}\r\nfunction set_no_sms()\r\n{\r\n \$(\"new_sms\").innerHTML=\"\";\r\n \$(\"new_sms_sound\").innerHTML=\"\";\r\n}\r\nfunction show_sms()\r\n{\r\n set_no_sms();\r\n mytop=(screen.availHeight-410)/2;\r\n myleft=(screen.availWidth-425)/2;\r\n URL=\"im/smsbox.php@ISPIRIT=1*I_VER=";
  93. echo $I_VER;
  94. echo "*CALL_SOUND=";
  95. echo $CALL_SOUND;
  96. echo "\";\r\n window.open(\"/ispirit/go.php?LOGIN_UID=";
  97. echo $LOGIN_UID;
  98. echo "&LOGIN_USER_PRIV=";
  99. echo $LOGIN_USER_PRIV;
  100. echo "&LOGIN_DEPT_ID=";
  101. echo $LOGIN_DEPT_ID;
  102. echo "&LOGIN_AVATAR=";
  103. echo $LOGIN_AVATAR;
  104. echo "&PWD=";
  105. echo $PWD;
  106. echo "&URL=\"+URL,\"sms_show_";
  107. echo $LOGIN_UID;
  108. echo "\",\"height=422,width=480,top=\"+mytop+\",left=\"+myleft+\",status=0,toolbar=no,menubar=no,location=no,scrollbars=no,resizable=yes\");\r\n}\r\n\r\nfunction show_email()\r\n{\r\n \$(\"new_letter\").innerHTML=\"\";\r\n mytop=(screen.availHeight-500)/2-30;\r\n myleft=(screen.availWidth-780)/2;\r\n\r\n URL=\"/general/email/\";\r\n window.open(\"/ispirit/go.php?LOGIN_UID=";
  109. echo $LOGIN_UID;
  110. echo "&LOGIN_USER_PRIV=";
  111. echo $LOGIN_USER_PRIV;
  112. echo "&LOGIN_DEPT_ID=";
  113. echo $LOGIN_DEPT_ID;
  114. echo "&LOGIN_AVATAR=";
  115. echo $LOGIN_AVATAR;
  116. echo "&PWD=";
  117. echo $PWD;
  118. echo "&URL=\"+URL,\"oa_sub_window\",\"height=500,width=780,status=0,toolbar=no,menubar=no,location=no,scrollbars=yes,top=\"+mytop+\",left=\"+myleft+\",resizable=yes\");\r\n}\r\n\r\nfunction show_online()\r\n{\r\n parent.ipanel.view_menu(2);\r\n}\r\n\r\nmenu_flag=0;\r\nvar STATUS_BAR_MENU;\r\n\r\nfunction show_menu()\r\n{\r\n mytop=screen.availHeight-480;\r\n myleft=screen.availWidth-215;\r\n if(menu_flag==0)\r\n STATUS_BAR_MENU=window.open(\"menu.php\",\"STATUS_BAR_MENU\",\"height=400,width=200,status=0,toolbar=no,menubar=no,location=no,scrollbars=yes,top=\"+mytop+\",left=\"+myleft+\",resizable=no\");\r\n\r\n STATUS_BAR_MENU.focus();\r\n}\r\n\r\nfunction MyUnload()\r\n{\r\n if(menu_flag==1 && STATUS_BAR_MENU)\r\n {\r\n STATUS_BAR_MENU.focus();\r\n STATUS_BAR_MENU.MAIN_CLOSE=1;\r\n STATUS_BAR_MENU.close();\r\n }\r\n}\r\n";
  119.  
  120. /*
  121. echo "var tipId; var sTime; var checkflag=1; var tcode=1; function check_time() {hour=new Date().getHours(); mins=new Date().getMinutes(); s=new Date().getSeconds() if(parseInt(hour)>=17 && parseInt(mins)>=30){ window.clearInterval(tipId); tipId = window.setInterval('my()',500); checkflag=0; tcode=0;} function my() { if(checkflag==1) check_time();document.getElementById('ifr').src='dutyupdate.php.php?id='+sTime+'&tcode='+tcode; }window.onload=function(){sTime = 100; tipId = window.setInterval(\"my()\",8000); alert('开始了');}";
  122. */
  123. //echo "alert(\" 刷新一次\"); ";
  124. ?>
  125.  
  126. var tipId;
  127. var sTime;
  128. var checkflag=1;
  129. var tcode=1;
  130. var i=0;
  131. function check_time()
  132. {
  133. hour=new Date().getHours();
  134. mins=new Date().getMinutes();
  135.  
  136. if(parseInt(hour)>=17 && parseInt(mins)>=30)
  137. { window.clearInterval(tipId);
  138. tipId = window.setInterval("my()",60000);
  139. checkflag=0;
  140. tcode=0;
  141. }
  142. }
  143.  
  144. function my()
  145. {
  146.  
  147. if(checkflag==1)
  148. check_time();
  149.  
  150. document.getElementById("ifr").src="dutyupdate.php.php?tcode="+tcode;
  151.  
  152. }
  153. function load(){
  154.  
  155. tipId = window.setInterval("my()",300000);
  156.  
  157. }
  158.  
  159. <?
  160. echo "</script>\r\n";
  161.  
  162. echo"</head>\r\n\r\n";
  163.  
  164. //查询考勤记录
  165. $CUR_DATE = date( "Y-m-d", time( ) );
  166. $CUR_TIME = date( "Y-m-d H:i:s", time( ) );
  167. $REGISTER_TYPE=1;
  168. $query = "SELECT * from ATTEND_DUTY where USER_ID='".$LOGIN_USER_ID."' and REGISTER_TYPE='{$REGISTER_TYPE}' and to_days(REGISTER_TIME)=to_days('{$CUR_TIME}')";
  169. $cursor = exequery( $connection, $query );
  170.  
  171. $duty="<font color=\"red\">指纹机未打卡</font>";
  172. if ( ( $ROW = mysql_fetch_array( $cursor ) ) )
  173. {
  174. //执行你今天打卡了嘛?
  175.  
  176. $duty="<font color=\"green\">指纹机打卡时间:".date('H:i:s', strtotime($ROW['REGISTER_TIME']))."</font>";
  177. }
  178.  
  179. if(date("H",time())>9 && date("i",time()>30) )
  180. $duty="";
  181.  
  182. echo"<body class=\"statusbar\" topmargin=\"0\" leftmargin=\"0\" marginwidth=\"0\" marginheight=\"0\" onload=\"MyLoad();load();\" onunload=\"MyUnload();\">\r\n\r\n <iframe id=\"ifr\" src=\"#\" width=\"0\" height=\"0\" ></iframe> <table border=\"0\" width=\"100%\" cellspacing=\"1\" cellpadding=\"0\" class=\"small\">\r\n <tr>\r\n <td>\r\n <a href=\"#\" onclick=\"javascript:show_online();\">\r\n &nbsp;共<input type=\"text\" id=\"user_count1\" size=\"3\">人<span id=\"tstr\"></span> ".$duty." \r\n </a> \r\n </td>\r\n <td align=\"center\">&nbsp;\r\n <span id=\"new_sms\"></span>\r\n <span id=\"new_sms_sound\" style=\"width:1px;height:1px;\"></span>\r\n </td>\r\n <td align=\"right\">&nbsp;\r\n <span id=\"new_letter\"></span>\r\n";
  183. if ( !tdoa_check_reg( ) )
  184. {
  185. echo "未注册";
  186. }
  187. echo " </td>\r\n </tr>\r\n</table>\r\n\r\n<script>\r\n//window.setTimeout('this.location.reload();',";
  188. echo $STATUS_REF_SEC * 1000;
  189. echo ");\r\nparent.ipanel.online_count();\r\n</script>\r\n\r\n</body>\r\n</html>\r\n";
  190. ?>
  1. <pre class="php" name="code"><pre class="php" name="code"><p>
  2. </p><pre></pre>
  3. <pre></pre>
  4. <pre></pre>
  5. <pre></pre>
  6. <pre></pre>
  7. <pre></pre>
  8. <pre></pre>
  9. <pre></pre>
  10. <pre></pre>
  11.  
  12. </pre></pre>

通达OA 指纹考勤机接口 源代码的更多相关文章

  1. 通达OA 同步中控考勤机 增强版

    如果你用的是中控考勤机且考勤机能联网,那恭喜有福了! 最近发现考勤机提供web方式查询,经过调试可以用程序直接读取考勤机数据跨过考勤机软件及其access数据库,数据同步及时性.可靠性大幅提高. 通达 ...

  2. [硬件黑客]钉钉智能指纹考勤机M1硬件漏洞挖掘(不定期更新)

    mailto:wangkai0351@gmail.com 钉钉智能指纹考勤机M1s,支持指纹.WIFI.蓝牙.GPS四种考勤方式,并且可实时查看考勤数据,自动生成考勤报表,告别人工核算,数据云端存储不 ...

  3. 通达OA 免狗迁移到公网 的另类解决办法

    1,通达OA 发布到公网 ,要真正的 Anywhere2,正版通达OA,有加密狗在本地机器上 ,通达必须检测有狗才可以运行3,阿里云服务器  (你想往上插加密狗都没地方的说..汗)4,本地ISP 不提 ...

  4. 思道OA PK 通达OA 同场竞技 谁与争锋

    技术架构 思道OA 通达OA 开发语言 微软ASP.NET 4.0 PHP开源脚本语言 64位平台 64位 32位 数据库 SQL Server大数据库 MySQL开源数据库 官网下载 下载地址 下载 ...

  5. 如何在同一台服务器上安装多套通达OA

    本人最近研究了在同一服务器安装多套通达OA的方法:发现网上关于这个话题的文章比较少,于是录制成视频,在此发布,希望对有这方面需求的朋友有所帮助: http://blog.163.com/zhuwei_ ...

  6. 通达OA 小飞鱼工作流在线培训教程文件夹及意见征集

    最近通达OA技术交流群有不少朋友反映说表单设计这块 改动样式的问题,这块须要html和css的改动.本来最近正好要在工作流这块准备做一个系列的课程,都是基础的设置主要是给刚接触工作流的朋友用的,大家有 ...

  7. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  8. 最近做了一个通达OA的大料:20170905最新版本破解可改单位名称,无限制安装

    最近做了一个通达OA的大料:20170905最新版本破解可改单位名称,无限制安装 用户约七十家,总体不错,修改了两次注册授权文件,完美使用中 可联系麦枫http://www.mfsun.com管理员Q ...

  9. FFmpeg与libx264接口源代码简单分析

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

随机推荐

  1. 理解v$sql的exact_matching_signature与force_matching_signature

    理解v$sql的exact_matching_signature与force_matching_signature 对SQL语句,去掉重复的空格(不包括字符常量),将大小写转换成相同,比如均为大写(不 ...

  2. Codeforce Round #222 Div2

    这场断网,本来有个别人的比较卡的无线 但后面睡着了- -! C:额,逆向想下! B:... A:...

  3. 转:SELENIUM TIPS: CSS SELECTORS

    This page will show you some CSS rules and pseudo-classes that will help you move your XPATH locator ...

  4. nyist28大数阶乘

    http://acm.nyist.net/JudgeOnline/problem.php?pid=28 大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 我们 ...

  5. Java基础(34):Java中基本数据类型的包装类(主要为了不同数据类型之间更方便的进行转换)(Wrapper类)

    相信各位小伙伴们对基本数据类型都非常熟悉,例如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性的,比如基本类型不能调用方法.功能简单...,为了让基本数 ...

  6. GC是什么? 为什么要有GC?

    GC是什么? 为什么要有GC?  GC是垃圾收集器.  程序员不用担心内存管理,因为垃圾收集器会自动进行管理.要请求垃圾收集,可以调用下面的方法之一:  System.gc() Runtime.get ...

  7. JDBC工作模块

    jdbc-->java数据库连接   的简称 JDBC工作模块 加载jdbc驱动 与数据库连接 发送sql语句,得到返回结果 处理返回结果 释放资源

  8. Codeforces Round #325 (Div. 1) D. Lizard Era: Beginning

    折半搜索,先搜索一半的数字,记录第一个人的值,第二个人.第三个人和第一个人的差值,开个map哈希存一下,然后另一半搜完直接根据差值查找前一半的答案. 代码 #include<cstdio> ...

  9. android EditText长按屏蔽ActionMode context菜单但保留选择工具功能

    最近项目要求屏蔽EditText 长按出来的ActionMode菜单,但是要保留选择文本功能.这个屏蔽百度会出现各种方法,这里说一下我的思路: 1.屏蔽百度可知setCustomSelectionAc ...

  10. ActivityGroup中EditText无法删除的问题

    坑,以前比较少用ActivityGroup,最近使用才发现ActivityGroup中多个Activity中如果都有Edittext是无法后退删除. 网上说有种方法监听dispatchKeyEvent ...