根据 XMPP 的 XEP 标准协议规范,实现 avatar 头像传输与存储的功能主要有三种实现方式,分别对应于协议规范:

    + 【XEP-0153】vCard-BasedAvatars     http://xmpp.org/extensions/xep-0153.html

    + 【XEP-0084】UserAvatar             http://xmpp.org/extensions/xep-0084.html
   + 【XEP-0008】IQ-BasedAvatars        
http://xmpp.org/extensions/xep-0008.html

其中

    + XEP-0153是通过将 avatar 头像存储在 vcard 的 XML 报文中实现的,这个也是 openfire 和 spark 中支持的方式;

在 openfire 中的 vcard 的实现都在 org.jivesoftware.openfire.vcard 包中,其中:


       -
用户的 vcard 的存储实现在类 DefaultVCardProvider 中处理了 vcard 的查询,删除,更新,新增等 DB 操作;
       - 在VCardManager 中实现对 vcard 的缓存与管理(包括新增,删除,更新,以及查询);

这种实现方式比较直接,在服务端就是将用户的 vcard(XML格式)信息一起存储在表(ofVcard)中,示例:


 
     
     
     
 

 
     
     
 

 
 
 <br>  <NICKNAME/><br><br><span style="color:#2d4fc9;"><PHOTO><TYPE>p_w_picpath/jpeg</TYPE><BINVAL>/9j/4AAQSkZJRgABAQEAYABgAAD......YlFFFM4T//2Q==</BINVAL></PHOTO></span><br><br>  <EMAIL><br>      <HOME/><br>      <INTERNET/><br>      <PREF/><br>      <USERID/><br>  </EMAIL><br>  <TEL><PAGER/><WORK/><NUMBER/><br>  </TEL><br>  <TEL><CELL/><WORK/><NUMBER/><br>  </TEL><br>  <TEL><VOICE/><WORK/><NUMBER/><br>  </TEL><br>  <TEL><FAX/><WORK/><NUMBER/><br>  </TEL><br>  <TEL><PAGER/><HOME/><NUMBER/><br>  </TEL><br>  <TEL><CELL/><HOME/><NUMBER/><br>  </TEL><br>  <TEL><VOICE/><HOME/><NUMBER/><br>  </TEL><br>  <TEL><FAX/><HOME/><NUMBER/><br>  </TEL><br>  <ADR><WORK/><PCODE/><br>  <REGION/><br>  <STREET/><br>  <CTRY/><br>  <LOCALITY/><br>  </ADR><br>  <ADR><HOME/><PCODE/><br>  <REGION/><br>  <STREET/><br>  <CTRY/><br>  <LOCALITY/><br>  </ADR><br>  </vCard></p></td> </tr> </tbody> </table> <p> </p> <p><span style="font-family:'微软雅黑', sans-serif;">     + </span><strong><span style="font-family:'微软雅黑', sans-serif;color:#9c004c;">XEP-0008</span></strong><span style="font-family:'微软雅黑', sans-serif;">的 IQ-Based Avatars 实现方式现在已不被推荐,用官方协议来说:</span></p> <p> </p> <table width="100" style="width:703px;"> <tbody> <tr> <td valign="top" style="padding:2px 2px 2px 2px;"><p>WARNING: Consideration of this document  has been Deferred by the XMPP Standards Foundation. Implementation of the  protocol described herein is not recommended</p></td> </tr> </tbody> </table> <p> </p> <p><span style="font-family:'微软雅黑', sans-serif;">     + </span><strong><span style="font-family:'微软雅黑', sans-serif;color:#9c004c;">XEP-0084</span></strong><span style="font-family:'微软雅黑', sans-serif;"> User Avatar </span><span style="font-family:'微软雅黑', sans-serif;">是通过基于 pubsub 协议的基础上实现用户 头像 的发布(publish) 与 其他用户的订阅(subscribe);这也是 beem 的实现方式(beem 中也提供了直接通过 url 的方式下载头像);</span></p> <p> </p> <p><span style="font-family:'微软雅黑', sans-serif;">在 User Avatar 的协议中定义了两个 pubsub 节点,分别为:</span></p> <p><span style="font-family:'微软雅黑', sans-serif;"> <br><span>       - metadata </span><span style="font-family:'微软雅黑', sans-serif;">节点:主要包括 avatar 的状态信息;</span><br><span>       - data </span>节点:就是 avatar 的数据;<br><br>该协议也指出可以通过 HTTP 协议方式访问 avatar 的存储;<br><br>按照官方协议说法,该协议的实现方式可能要替代其他两种实现方式:<br><br><span>   It is intended that this specification will supersede both IQ-Based Avatars [6]and vCard-Based Avatars [7] once the PEP subset of XMPP publish-subscribe isimplemented and deployed widely enough.</span><br><br>针对 user avatar 方式的实现,针对 publisher 与 subscriber 至少需要完成如下功能:<br><br><span>       - Publishing avatar data</span><br><span>       - Updating metadata about the current avatar</span><br><span>       - Disabling avatars</span><br><br><span>       - Discovering avatar availability</span><br><span>       - Receiving notification of avatar changes</span><br><span>       - Retrieving avatar data via pubsub</span><br><span>       - Retrieving avatar data via HTTP</span><br></span></p> <span></span> <p><span style="font-family:'宋体';">上面只是对实现avatar相关XEP协议做一个初步的了解,我这里的实例仍然“偷懒”采用了VCard方式实现。</span></p> <p><span style="font-family:'宋体';">协议参考</span>: http://xmpp.org/extensions/xep-0054.html</p> <p>Smack <span style="font-family:'宋体';">中的</span> VCard API <span style="font-family:'宋体';">参考</span>: http://www.igniterealtime.org/builds/smack/docs/latest/javadoc/</p> <p> </p> <p style="margin-top:16px;margin-bottom:16px;margin-left:24px;"><strong>1,<span style="font-family:'宋体';">设置用户</span>blue<span style="font-family:'宋体';">的</span>VCard<span style="font-family:'宋体';">中的头像</span>avatar<span style="font-family:'宋体';">信息:</span></strong></p> <p style="margin-bottom:16px;margin-left:56px;">a)<span style="font-family:'宋体';">首先确认</span>ProviderManager<span style="font-family:'宋体';">已经加入</span>vcard-temp<span style="font-family:'宋体';">,如下代码:</span></p> <table style="width:703px;"> <tbody> <tr> <td width="568" valign="top" style="border-color:#000000;border-width:1px;padding:0px 7px;"><p><br></p><p>ProviderManager pm =  ProviderManager.getInstance();</p><p><br></p><p>         // Private Data Storage</p><p>         pm.addIQProvider("query", "jabber:iq:private", new  PrivateDataManager.PrivateDataIQProvider());</p><p><br></p><p>         // Roster Exchange</p><p>         pm.addExtensionProvider("x", "jabber:x:roster",  new RosterExchangeProvider());</p><p><br></p><p>         // Message Events</p><p>         pm.addExtensionProvider("x", "jabber:x:event", new  MessageEventProvider());</p><p><br></p><p>         // Delayed Delivery</p><p>         pm.addExtensionProvider("x", "jabber:x:delay", new  DelayInformationProvider());</p><p><br></p><p>         // Version</p><p>         try {</p><p>             pm.addIQProvider("query", "jabber:iq:version",</p><p>                     Class.forName("org.jivesoftware.smackx.packet.Version"));</p><p>         } catch (ClassNotFoundException e) {</p><p>            // Not sure what's happening  here.</p><p>         }</p><p><br></p><p><strong><span style="color:#00b050;">//  VCard</span></strong></p><p><strong><span style="color:#c00000;">pm.addIQProvider("vCard",  "vcard-temp", new VCardProvider());</span></strong></p><p><br></p><p>         // Offline Message Requests</p><p>         pm.addIQProvider("offline",  "http://jabber.org/protocol/offline", new  OfflineMessageRequest.Provider());</p></td> </tr> </tbody> </table> <p style="margin-top:16px;margin-bottom:16px;margin-left:56px;">b)<span style="font-family:'宋体';">设置用户选择的头像(其中还附带演示了设置用户</span>blue<span style="font-family:'宋体';">的其他信息,如</span>FirstName<span style="font-family:'宋体';">,</span>LastName<span style="font-family:'宋体';">,以及</span>NickName<span style="font-family:'宋体';">),如下示例代码:</span></p> <table style="width:703px;"> <tbody> <tr> <td width="568" valign="top" style="border-color:#000000;border-width:1px;background-color:#F2F2F2;padding:0px 7px;"><p><br></p><p>     public class SetVCardTask extends AsyncTask<Uri, Integer, Long></p><p>     {</p><p>         @Override</p><p>         protected Long doInBackground(Uri... params)</p><p>         {</p><p>            if (params.length < 1) {</p><p>                return Long.valueOf(-1);</p><p>            }</p><p><br></p><p>            Uri uriFile = params[0]; <strong><span style="color:#00b050;">// </span></strong><strong><span style="font-family:'宋体';color:#00b050;">需要传输的头像文件</span></strong></p><p>            ByteArrayOutputStream baos = new  ByteArrayOutputStream();</p><p>            FileInputStream fis;</p><p>            try</p><p>            {</p><p>                String[] proj = {  MediaStore.Images.Media.DATA };</p><p>                Cursor actualp_w_picpathcursor =  managedQuery(uriFile,proj,null,null,null);</p><p>                int actual_p_w_picpath_column_index</p><p>                        =  actualp_w_picpathcursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);</p><p>                 actualp_w_picpathcursor.moveToFirst();</p><p>                String filePath =  actualp_w_picpathcursor.getString(actual_p_w_picpath_column_index);</p><p>                fis = new FileInputStream(new  File(filePath));</p><p>                byte[] buf = new byte[1024];</p><p>                int n;</p><p>                while (-1 != (n =  fis.read(buf)))</p><p>                {</p><p>                    baos.write(buf, 0, n);</p><p>                }</p><p>            }</p><p>            catch (Exception e)</p><p>            {</p><p>                e.printStackTrace();</p><p>            }</p><p>            byte[] bbytes =  baos.toByteArray();</p><p><br></p><p><strong><span style="color:#00b050;">// </span></strong><strong><span style="font-family:'宋体';color:#00b050;">设置和更新用户信息</span></strong></p><p><strong><span style="color:#c00000;">VCard vCard = new VCard();</span></strong></p><p><strong><span style="color:#c00000;">             vCard.setFirstName("Steven");</span></strong></p><p><strong><span style="color:#c00000;">             vCard.setLastName("Hu");</span></strong></p><p><strong><span style="color:#c00000;">             vCard.setNickName("</span></strong><strong><span style="font-family:'宋体';color:#c00000;">安静的疯子</span><span style="color:#c00000;">");</span></strong></p><p><strong><span style="text-decoration:underline;"><span style="color:#31859c;">vCard.setAvatar(bbytes);</span></span></strong></p><p><strong><span style="color:#c00000;">            try</span></strong></p><p><strong><span style="color:#c00000;">            {</span></strong></p><p><strong><span style="color:#c00000;">                vCard.save(MainHelloIM.getInstance().getConnection());</span></strong></p><p><strong><span style="color:#c00000;">            }</span></strong></p><p>            catch (XMPPException e)</p><p>            {</p><p>                e.printStackTrace();</p><p>            }</p><p><br></p><p>            return Long.valueOf(0);</p><p>         }</p><p>     }</p></td> </tr> </tbody> </table> <p style="margin-left:28px;"><br></p> <p style="margin-left:56px;">c)<span style="font-family:'宋体';">最终在服务端的数据库中可以看到如下数据(其中可以看到用户昵称也都设置成功了):</span></p> <p style="margin-left:56px;"><span style="font-family:'宋体';"><a href="http://img.e-com-net.com/image/info3/e9e34b1c665f4985b4578d0c9501858d.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info3/e9e34b1c665f4985b4578d0c9501858d.jpg" title="0001.png" alt="在 Android 的 IM 应用中使用 asmack 库实现用户头像的传输(基于VCard协议)_第1张图片" width="650" height="376" style="border:1px solid black;"></a></span></p> <p style="margin-top:16px;margin-bottom:16px;margin-left:56px;">d)<span style="font-family:'宋体';">通过</span>spark<span style="font-family:'宋体';">登录成功后,可以看到头像已经更新如下:</span></p> <p style="margin-top:16px;margin-bottom:16px;margin-left:28px;">    <a href="http://img.e-com-net.com/image/info3/4f05586fd2ca49658016984620072c6f.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info3/4f05586fd2ca49658016984620072c6f.jpg" title="003.png" alt="在 Android 的 IM 应用中使用 asmack 库实现用户头像的传输(基于VCard协议)_第2张图片" width="206" height="104" style="border:1px solid black;"></a></p> <span></span> <p style="margin-top:16px;margin-bottom:16px;margin-left:24px;"><strong>2,<span style="font-family:'宋体';">查看用户</span>blue<span style="font-family:'宋体';">的</span>VCard<span style="font-family:'宋体';">信息</span></strong></p> <p style="margin-top:16px;margin-bottom:16px;margin-left:56px;">a)<span style="font-family:'宋体';">首先确认</span>ProviderManager<span style="font-family:'宋体';">已经加入</span>vcard-temp<span style="font-family:'宋体';">,同上;</span></p> <p style="margin-top:16px;margin-bottom:16px;margin-left:56px;">b)<span style="font-family:'宋体';">采用异步任务来获取用户</span>blue<span style="font-family:'宋体';">的</span>VCard<span style="font-family:'宋体';">信息中的昵称</span></p> <table style="width:703px;"> <tbody> <tr> <td width="568" valign="top" style="border-color:#000000;border-width:1px;padding:0px 7px;"><p>     public class GetVCardTask extends AsyncTask<String, Integer,  Long></p><p>     {</p><p>         @Override</p><p>         protected Long doInBackground(String... params)</p><p>         {</p><p>            if (params.length < 1) {</p><p>                return Long.valueOf(-1);</p><p>            }</p><p><br></p><p><strong><span style="color:#00b050;">// </span></strong><strong><span style="font-family:'宋体';color:#00b050;">获取用户</span><span style="color:#00b050;"> params[0] </span></strong><strong><span style="font-family:'宋体';color:#00b050;">的</span><span style="color:#00b050;"> vcard </span></strong><strong><span style="font-family:'宋体';color:#00b050;">信息</span></strong></p><p>            try</p><p>            {</p><p><strong><span style="color:#00b050;">// load(Connection connection, String  user)</span></strong></p><p style="text-indent:112px;"><strong><span style="color:#c00000;">vcard.load(MainHelloIM.getInstance().getConnection(),  params[0]);</span></strong></p><p>                Log.d(TAG, "nickname:  " + vcard.getNickName());</p><p>            }</p><p>            catch (XMPPException e)</p><p>            {</p><p>                e.printStackTrace();</p><p>                 return Long.valueOf(-2);</p><p>            }</p><p><br></p><p>            return Long.valueOf(0);</p><p>         }</p></td> </tr> </tbody> </table> <p style="margin-top:16px;margin-bottom:16px;"><br></p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1209375110440521728"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(android,vcard,avatar,移动客户端)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1901568771840077824.htm" title="Android APP架构设计——MVP的使用示例" target="_blank">Android APP架构设计——MVP的使用示例</a> <span class="text-muted">weixin_30633507</span> <a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91/1.htm">移动开发</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95/1.htm">测试</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a> <div>0.前言为了更好地进行移动端架构设计,我们最常用的就是MVC、MVP和MVVM,作为三个最耳熟能详的三大架构,应用可谓非常广泛。对于这三种架构设计以及优缺点已经在AndroidAPP架构设计——MVC、MVP和MVVM介绍一文中介绍过了,本文是对前面那篇文章2.3小节的补充,介绍MVP模式在Android中的使用示例,目的在于深化对MVP架构的理解。1.使用场景这里我们实现一个简单的登录功能。先看</div> </li> <li><a href="/article/1901539139375919104.htm" title="Kotlin知识体系(一) : Kotlin的五大基础语法特性" target="_blank">Kotlin知识体系(一) : Kotlin的五大基础语法特性</a> <span class="text-muted">氦客</span> <a class="tag" taget="_blank" href="/search/%E7%9F%A5%E8%AF%86%E4%BD%93%E7%B3%BB/1.htm">知识体系</a><a class="tag" taget="_blank" href="/search/-/1.htm">-</a><a class="tag" taget="_blank" href="/search/Kotlin%E5%9F%BA%E7%A1%80/1.htm">Kotlin基础</a><a class="tag" taget="_blank" href="/search/kotlin/1.htm">kotlin</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95/1.htm">基础语法</a><a class="tag" taget="_blank" href="/search/%E7%89%B9%E6%80%A7/1.htm">特性</a><a class="tag" taget="_blank" href="/search/%E7%9F%A5%E8%AF%86%E4%BD%93%E7%B3%BB/1.htm">知识体系</a> <div>前言在Android开发领域,Kotlin凭借其简洁性和安全性已成为官方推荐语言。本文将通过Kotlin的五大基础语法特性,结合实际应用场景展示它们在Android开发中的独特价值。一、变量声明:val与var的哲学1.1不可变优先原则Kotlin的val关键字用于声明不可变变量(相当于Java的final),这是构建可靠Android应用的基石:valPI=3.14159//类型推断为Doubl</div> </li> <li><a href="/article/1901534347459096576.htm" title="Kotlin知识体系(二) : Kotlin的七个关键特性" target="_blank">Kotlin知识体系(二) : Kotlin的七个关键特性</a> <span class="text-muted">氦客</span> <a class="tag" taget="_blank" href="/search/%E7%9F%A5%E8%AF%86%E4%BD%93%E7%B3%BB/1.htm">知识体系</a><a class="tag" taget="_blank" href="/search/-/1.htm">-</a><a class="tag" taget="_blank" href="/search/Kotlin%E5%9F%BA%E7%A1%80/1.htm">Kotlin基础</a><a class="tag" taget="_blank" href="/search/kotlin/1.htm">kotlin</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E7%89%B9%E6%80%A7/1.htm">特性</a><a class="tag" taget="_blank" href="/search/%E5%AF%86%E5%B0%81%E7%B1%BB/1.htm">密封类</a><a class="tag" taget="_blank" href="/search/data/1.htm">data</a><a class="tag" taget="_blank" href="/search/class/1.htm">class</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%8D%93/1.htm">安卓</a> <div>前言在Android开发中,Kotlin以其简洁的语法和强大的特性显著提升了开发效率。本文将解析Kotlin中7个关键特性,通过代码示例展示它们在实际开发中的应用。一、构造函数:主次分明主构造函数classUserconstructor(_name:String){//传统写法valname=_name}classStudent(valid:Int,varname:String)//简化版主构造函</div> </li> <li><a href="/article/1901520855041634304.htm" title="解决 Flutter Device Daemon 启动失败问题的实践记录" target="_blank">解决 Flutter Device Daemon 启动失败问题的实践记录</a> <span class="text-muted">又吹风_Bassy</span> <a class="tag" taget="_blank" href="/search/flutter/1.htm">flutter</a><a class="tag" taget="_blank" href="/search/Flutter/1.htm">Flutter</a><a class="tag" taget="_blank" href="/search/Daemon/1.htm">Daemon</a><a class="tag" taget="_blank" href="/search/file/1.htm">file</a><a class="tag" taget="_blank" href="/search/handles/1.htm">handles</a><a class="tag" taget="_blank" href="/search/Daemon/1.htm">Daemon</a><a class="tag" taget="_blank" href="/search/Crash/1.htm">Crash</a><a class="tag" taget="_blank" href="/search/AndroidStudio/1.htm">AndroidStudio</a> <div>解决FlutterDeviceDaemon启动失败问题的实践记录最近在使用Flutter开发时踩了一个坑。看似是个小问题,但折腾了好久,最终通过日志分析和查阅资料才找到了解决办法。这里记录一下整个问题的排查过程,希望能帮助到遇到类似问题的小伙伴。问题背景事情是这样的,我在启动AndroidStudio时突然弹出了一个错误窗口:提示Flutterdaemon启动失败,过了一会儿之后,又弹出下面的弹窗</div> </li> <li><a href="/article/1901513292266926080.htm" title="kotlin中的行为组件" target="_blank">kotlin中的行为组件</a> <span class="text-muted">每次的天空</span> <a class="tag" taget="_blank" href="/search/kotlin/1.htm">kotlin</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>在Android开发领域,Jetpack已经成为现代化应用开发的标配。除了界面组件外,其提供的行为组件(BehaviorComponents)更是解决了众多开发痛点。本文将深入解析WorkManager、DataBinding、Coroutines和Lifecycle四大核心组件的工作原理,并结合实战代码展示它们的具体用法。首先要添加jetpack相关的依赖库,操作如下:android{...da</div> </li> <li><a href="/article/1901509007307239424.htm" title="android 自定义分辨率,Moonlight Android端自定义分辨率,解决黑边问题" target="_blank">android 自定义分辨率,Moonlight Android端自定义分辨率,解决黑边问题</a> <span class="text-muted">weixin_39661589</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%AE%9A%E4%B9%89%E5%88%86%E8%BE%A8%E7%8E%87/1.htm">自定义分辨率</a> <div>更新:使用原版moonlight修改特殊分辨率需要root权限,没有root权限可尝试此版本的moonlight选择当前设备分辨率。再次更新:moonlight9.8版本以上已经支持设置为当前设备分辨率。问题描述本人手机分辨率是2340×1080,在使用moonlight串流时分辨率选择1080p,发现有黑边,此时串流的分辨率为1920×1080。解决方案第一步,调整主机分辨率可以看到,主机实际显</div> </li> <li><a href="/article/1901500179618525184.htm" title="linux下使用curl访问多参数url" target="_blank">linux下使用curl访问多参数url</a> <span class="text-muted">耘田</span> <a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/curl/1.htm">curl</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/url/1.htm">url</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E5%8F%82%E6%95%B0/1.htm">多参数</a> <div>curl-ihttp://marsoffset.goforandroid.com/GoSmsMarService/abc?a=116.397428&b=39.90923[1]8741[jb-xccheng@usa-ip-12~]$HTTP/1.1500InternalServerErrorServer:nginx/1.2.0Date:Wed,20Jun201204:16:21GMTContent-</div> </li> <li><a href="/article/1901483792103698432.htm" title="加固与脱壳05 - 壳类型识别" target="_blank">加固与脱壳05 - 壳类型识别</a> <span class="text-muted">二手的程序员</span> <a class="tag" taget="_blank" href="/search/%E5%8A%A0%E5%9B%BA%E4%B8%8E%E8%84%B1%E5%A3%B3/1.htm">加固与脱壳</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>以前一些老旧的技术就不介绍了,比如,动态加载、内存不落地加载的方式。现在的加壳类型分为3种:指令抽取VMPdexc2chttps://www.dingxiang-inc.com/blog/post/2指令抽取android的指令抽取,主要在于函数基本的抽取保护。通过使用android虚拟机自带的解释器进行执行代码。将原始App中dex文件的函数内容进行清除,并将单独移动到一个加密文件中,在App运</div> </li> <li><a href="/article/1901467397131399168.htm" title="鸿蒙开发2024【面试题库】讲解,近期需要面试的可千万别错过!" target="_blank">鸿蒙开发2024【面试题库】讲解,近期需要面试的可千万别错过!</a> <span class="text-muted">鸿蒙系统小能手Mr.Li</span> <a class="tag" taget="_blank" href="/search/%E9%B8%BF%E8%92%99%E5%BC%80%E5%8F%91/1.htm">鸿蒙开发</a><a class="tag" taget="_blank" href="/search/harmonyos/1.htm">harmonyos</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E9%B8%BF%E8%92%99/1.htm">鸿蒙</a><a class="tag" taget="_blank" href="/search/OpenHarmony/1.htm">OpenHarmony</a><a class="tag" taget="_blank" href="/search/%E9%B8%BF%E8%92%99%E7%B3%BB%E7%BB%9F/1.htm">鸿蒙系统</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91/1.htm">移动开发</a> <div>1.请简述鸿蒙OS与AndroidOS的主要区别是什么?设备兼容性:鸿蒙OS是一款面向各种设备的分布式操作系统,支持手机、平板电脑、智能手表、智能家居、汽车等多种设备类型,并能在这些设备之间实现无缝切换和共享数据。而Android系统则主要用于移动设备,如手机和平板电脑。系统架构:鸿蒙OS采用分布式技术架构,通过分布式技术实现多设备间的协作和数据共享,更加灵活、安全、高效。而Android则采用单</div> </li> <li><a href="/article/1901458954437849088.htm" title="去除Dialog出现时背景变暗效果的方法" target="_blank">去除Dialog出现时背景变暗效果的方法</a> <span class="text-muted">Shawn_LX</span> <div>在样式XML文件下添加自定义Dialog样式,继承自android:Theme.Dialog主题样式true@android:color/transparentfalse加入以上属性后重写onCreateDialog()方法:@OverrideprotectedDialogonCreateDialog(intid){//TODOAuto-generatedmethodstubif(id==1){D</div> </li> <li><a href="/article/1901458701852667904.htm" title="android 时间的格式化问题" target="_blank">android 时间的格式化问题</a> <span class="text-muted">Shawn_LX</span> <div>android中经常遇到要格式化时间,下面记录一下"yyyy-MM-dd”类型和”kk:mm:ss”类型的时间格式化方法:“staticSimpleDateFormatdateFormat=newSimpleDateFormat("yyyy-MM-dd");//只取年--月--日publicstaticintdiffDays(StringcompareTime){Calendarnow=Calen</div> </li> <li><a href="/article/1901458702360178688.htm" title="android 自定义悬浮菜单" target="_blank">android 自定义悬浮菜单</a> <span class="text-muted">Shawn_LX</span> <div>android中的自定义的悬浮菜单,其实就是一个dialog。类似于下图。代码如下:/***此类为自定义菜单Dialog**/publicclassMenuDialogextendsDialog{privatestaticfinalintH_NO_LOGIN=0;privatestaticfinalintH_REFRESH_VIEW=1;privateContextcontext;privateb</div> </li> <li><a href="/article/1901433364154478592.htm" title="Android15音频进阶之qnx定位so调用进程(一百一十一)" target="_blank">Android15音频进阶之qnx定位so调用进程(一百一十一)</a> <span class="text-muted">Android系统攻城狮</span> <a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/Audio%E5%B7%A5%E7%A8%8B%E5%B8%88%E8%BF%9B%E9%98%B6%E7%B3%BB%E5%88%97/1.htm">Audio工程师进阶系列</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a><a class="tag" taget="_blank" href="/search/Android15/1.htm">Android15</a><a class="tag" taget="_blank" href="/search/QNX/1.htm">QNX</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E9%A2%91%E8%B0%83%E8%AF%95/1.htm">音频调试</a> <div>简介:CSDN博客专家、《Android系统多媒体进阶实战》一书作者新书发布:《Android系统多媒体进阶实战》优质专栏:Audio工程师进阶系列【原创干货持续更新中……】优质专栏:多媒体系统工程师系列【原创干货持续更新中……】优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课</div> </li> <li><a href="/article/1901425669615710208.htm" title="Android wifi的开关Settings值异常分析" target="_blank">Android wifi的开关Settings值异常分析</a> <span class="text-muted">峥嵘life</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/Android%E7%B3%BB%E7%BB%9F/1.htm">Android系统</a><a class="tag" taget="_blank" href="/search/Android%E7%BD%91%E7%BB%9C/1.htm">Android网络</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>Androidwifi的开关Settings值异常分析文章目录Androidwifi的开关Settings值异常分析一、前言二、异常分析1、adb或者串口获取Settings的wifi开关值2、代码获取wifi开关值3、根据日志分析代码(1)logcat对应的wifi开启日志的代码①WifiServiceImpl.java②WifiSettingsStore.java3、wifi_on不同的具体原</div> </li> <li><a href="/article/1901420376429228032.htm" title="Android开源库——RxJava和RxAndroid" target="_blank">Android开源库——RxJava和RxAndroid</a> <span class="text-muted">松仔log</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Android%E5%BC%80%E6%BA%90%E5%BA%93/1.htm">Android开源库</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90/1.htm">开源</a><a class="tag" taget="_blank" href="/search/rxjava/1.htm">rxjava</a> <div>RxJava和RxAndroid是什么?RxJava是基于JVM的响应式扩展,用于编写异步代码RxAndroid是关于Android的RxJava绑定RxJava和RxAndroid使用依赖implementation'io.reactivex.rxjava3:rxjava:3.1.0'implementation'io.reactivex.rxjava3:rxandroid:3.0.2'使用过程</div> </li> <li><a href="/article/1901420250084208640.htm" title="Android Dagger2 框架作用域管理模块深度剖析(五)" target="_blank">Android Dagger2 框架作用域管理模块深度剖析(五)</a> <span class="text-muted">&有梦想的咸鱼&</span> <a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/Dagger2%E5%8E%9F%E7%90%86/1.htm">Dagger2原理</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>一、引言在Android开发中,依赖注入(DependencyInjection,简称DI)是一种重要的设计模式,它能有效降低代码之间的耦合度,提升代码的可测试性和可维护性。Dagger2作为一款强大的依赖注入框架,凭借其在编译时生成依赖注入代码的特性,避免了运行时反射带来的性能开销。而作用域管理模块是Dagger2中极为关键的一部分,它能精准控制依赖对象的生命周期,确保在特定作用域内依赖对象的唯</div> </li> <li><a href="/article/1901418232418463744.htm" title="Agora-Uniapp-SDK 使用指南" target="_blank">Agora-Uniapp-SDK 使用指南</a> <span class="text-muted">章瑗笛</span> <div>Agora-Uniapp-SDK使用指南Agora-Uniapp-SDK项目地址:https://gitcode.com/gh_mirrors/ag/Agora-Uniapp-SDK1.项目目录结构及介绍Agora-Uniapp-SDK是一个基于Uni-app与AgoraAndroid和iOS视频SDK实现的集成库,它专门设计用于简化在uni-app项目中集成Agora音视频功能的过程。以下是其主</div> </li> <li><a href="/article/1901418232850477056.htm" title="android 后台下载任务,断点续传" target="_blank">android 后台下载任务,断点续传</a> <span class="text-muted">lynn8570_blog</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>下载文件/***文件下载工具*/objectDownloadUtil{privatefungetOkHttpClient():OkHttpClient{returnOkHttpClient.Builder().addInterceptor(TokenIntercepter()).connectTimeout(20L,TimeUnit.SECONDS)//连接超时.writeTimeout(20L,</div> </li> <li><a href="/article/1901414574771466240.htm" title="Android中实现多线程的几种方式" target="_blank">Android中实现多线程的几种方式</a> <span class="text-muted">Ever69</span> <a class="tag" taget="_blank" href="/search/Android%E3%80%8A%E8%91%B5%E8%8A%B1%E5%AE%9D%E5%85%B8%E3%80%8B/1.htm">Android《葵花宝典》</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>目录1.基础线程(Thread)2.Handler与Looper3.AsyncTask(已废弃,仅作了解)4.ExecutorService(线程池)5.IntentService(已废弃,推荐WorkManager)6.Kotlin协程(Coroutines,现代推荐方案)7.HandlerThread对比总结最佳实践建议在Android中,实现多线程编程主要有以下几种方式,每种方式都有其适用场</div> </li> <li><a href="/article/1901412305397149696.htm" title="车载Android音频系统 CarAudioService" target="_blank">车载Android音频系统 CarAudioService</a> <span class="text-muted">Code_onepage</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>CarAudioService是车载音频系统的核心服务,负责管理多音源协调、音频路由、音量策略、硬件控制等关键功能,处理车载环境下特有的音频场景(如倒车提示音、车门状态联动等)。一、核心功能模块1.音频焦点管理焦点栈机制(mFocusStack)使用Stack管理不同音源的优先级处理导航/USB/蓝牙等音源的抢占逻辑//示例:焦点切换时的音频路由switchSource(null,AudioAtt</div> </li> <li><a href="/article/1901407137335144448.htm" title="androlua+单一界面编程" target="_blank">androlua+单一界面编程</a> <span class="text-muted">刘阿去</span> <a class="tag" taget="_blank" href="/search/lua/1.htm">lua</a> <div>实例如下:--载入库require"import"import"android.widget.*"import"android.view.*"--新建布局表layout={LinearLayout;--线性布局orientation="vertical";--垂直方向{Button;--按钮id="btn";text="hello";};{EditText;layout_width="200";}</div> </li> <li><a href="/article/1901369421415378944.htm" title="MediaPlayer 状态机,接口详情" target="_blank">MediaPlayer 状态机,接口详情</a> <span class="text-muted">趋势大仙</span> <a class="tag" taget="_blank" href="/search/android%E5%BA%94%E7%94%A8/1.htm">android应用</a><a class="tag" taget="_blank" href="/search/android%E6%BA%90%E7%A0%81/1.htm">android源码</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>一,AndroidMediaPlayer状态图MediaPlayer对象声明周期:从Idle到End状态就是MediaPlayer整个生命周期;--生命周期开始:进入Idle(闲置)状态;--生命周期结束:进入End(结束)状态;Idle和End状态转换:--进入Idle状态:MediaPlayer刚被创建newMediaPlayer()或者调用了reset()方法之后,进入Idle(闲置)状态;</div> </li> <li><a href="/article/1901369295095525376.htm" title="Android广播限制Background execution not allowed: receiving Intent { act=" target="_blank">Android广播限制Background execution not allowed: receiving Intent { act=</a> <span class="text-muted">趋势大仙</span> <a class="tag" taget="_blank" href="/search/%E5%BC%82%E5%B8%B8%E9%A2%98%E5%BA%93/1.htm">异常题库</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>“Backgroundexecutionnotallowed:receivingIntent”这个错误信息通常出现在Android应用开发中,特别是在处理后台任务或接收广播(Broadcast)时。这个错误表明应用试图在后台执行某些操作,但Android系统出于电池优化和用户体验的考虑,限制了后台任务的执行。可以尝试以下二种方法:1.把targetSdkVersion设置为25及以下的版本号,重新</div> </li> <li><a href="/article/1901346215363145728.htm" title="Android进行Post提交JSON数据注意事项" target="_blank">Android进行Post提交JSON数据注意事项</a> <span class="text-muted">kerry1789</span> <a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/%E6%84%9F%E6%85%A8/1.htm">感慨</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a> <div>刚好业务需要写一个测试程序给客户使用,直接入主题吧!请求地址:http://12.32.12.32:91889/testx.php请求参数:{"test1":"顾家家居口味咯咯咯","test2":"把1册","test3":"13512341234","test4":"5rW35Y2X55uR54ux566h55CG5bGA6LCD5bqm5oyH5oyl5bmz5Y","test5":"123</div> </li> <li><a href="/article/1901340790441963520.htm" title="深入理解 Android 中的 ViewModel 和 LiveData:实现数据与 UI 的分离与响应式更新" target="_blank">深入理解 Android 中的 ViewModel 和 LiveData:实现数据与 UI 的分离与响应式更新</a> <span class="text-muted">tangweiguo03051987</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/ViewModel/1.htm">ViewModel</a><a class="tag" taget="_blank" href="/search/LiveData/1.htm">LiveData</a> <div>ViewModel和LiveData是Android架构组件中的两个核心类,用于帮助开发者构建健壮、可维护且响应迅速的应用程序。它们通常一起使用,以实现数据与UI的分离,并确保数据在配置更改(如屏幕旋转)时不会丢失。ViewModelViewModel的主要目的是管理与UI相关的数据,并在配置更改时保持数据的持久性。它允许数据在Activity或Fragment销毁和重新创建时保持不变。1.1Vi</div> </li> <li><a href="/article/1901326042837086208.htm" title="安卓-关于使用startForegroundService启动服务于服务提前终止的思考" target="_blank">安卓-关于使用startForegroundService启动服务于服务提前终止的思考</a> <span class="text-muted">Auspemak-Derafru</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>在安卓官方说明中对前台服务的说明是这样的:从应用启动前台服务分为两步。首先,您必须通过调用context.startForegroundService()来启动服务。然后,让该服务调用ServiceCompat.startForeground()将自身提升为前台服务。启动前台服务|Backgroundwork|AndroidDevelopers其中,说明到了要调用ServiceCompat.sta</div> </li> <li><a href="/article/1901325916085219328.htm" title="java-通过继承android.location.Location实现自定义化的location对象" target="_blank">java-通过继承android.location.Location实现自定义化的location对象</a> <span class="text-muted">Auspemak-Derafru</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>起因:1.在中国大部分地区,由于政策原因。对定位的使用必须使用定位为俗称火星坐标的gcj02坐标系。然而,在调用安卓原生的android.location.LocationListener获取定位对象时,给到的将是以默认WGS84为坐标系的点,所以由于该种原因,导致我们在调用的大多数大陆地区api地图时会出错。2.获取到的定位点有可能出现漂移现象,为了给获取到的点打上标记,以便于后续的处理,我希望</div> </li> <li><a href="/article/1901231102031360000.htm" title="卓伊凡怒揭真相:鸿蒙自研铁证如山,岂容无端抹黑?" target="_blank">卓伊凡怒揭真相:鸿蒙自研铁证如山,岂容无端抹黑?</a> <span class="text-muted">卓伊凡</span> <a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BA%E9%B8%BF%E8%92%99harmony/1.htm">华为鸿蒙harmony</a><a class="tag" taget="_blank" href="/search/os/1.htm">os</a><a class="tag" taget="_blank" href="/search/next/1.htm">next</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E4%B8%93%E6%A0%8F/1.htm">开发专栏</a><a class="tag" taget="_blank" href="/search/%E9%B8%BF%E8%92%99%E7%B3%BB%E7%BB%9F/1.htm">鸿蒙系统</a><a class="tag" taget="_blank" href="/search/harmonyos/1.htm">harmonyos</a> <div>卓伊凡怒揭真相:鸿蒙自研铁证如山,岂容无端抹黑?在此,卓伊凡必须郑重且明确地向所有人宣告:鸿蒙,毫无疑问是一款彻头彻尾的自研系统!然而,即便在科技发展日新月异的2025年,仍有部分人,对鸿蒙系统从未有过实际的接触与了解,便在一旁肆意发表不实言论。更有甚者,一些所谓的“开发者”,实则仅仅是对技术怀有一定热情,却从未真正深入参与过实际的开发工作。他们竟以AndroidStudio为依据,妄言鸿蒙的De</div> </li> <li><a href="/article/1901218622773194752.htm" title="Android手机中各类安全相关知识总结" target="_blank">Android手机中各类安全相关知识总结</a> <span class="text-muted">数据知道</span> <a class="tag" taget="_blank" href="/search/2025%E5%B9%B4%E7%88%AC%E8%99%AB%E5%92%8C%E9%80%86%E5%90%91%E6%95%99%E7%A8%8B/1.htm">2025年爬虫和逆向教程</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E6%99%BA%E8%83%BD%E6%89%8B%E6%9C%BA/1.htm">智能手机</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a> <div>更多内容请见:爬虫和逆向教程-专栏介绍和目录文章目录1.Android安全威胁2.Android安全防护措施3.Android安全建议和最佳实践4.Android安全工具推荐5.Android安全常见问题5.1如何检测设备是否感染恶意软件?5.2如何防止应用滥用权限?5.3如何保护设备免受网络攻击?5.4设备丢失后如何保护数据?6.学习资源7.总结Android手机作为全球使用最广泛的移动操作系统</div> </li> <li><a href="/article/1901200091255992320.htm" title="Android Studio运行错误分析与解决:Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: s" target="_blank">Android Studio运行错误分析与解决:Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: s</a> <span class="text-muted">LuXi_foryou</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/ide/1.htm">ide</a> <div>AndroidStudio运行错误分析与解决:常见问题汇总作为一名Android开发者,在使用AndroidStudio时,难免会遇到各种运行错误。今天,我将分享一些常见的错误及其解决方法,帮助大家快速定位问题并修复代码。错误1:org.codehaus.groovy.control.MultipleCompilationErrorsException:startupfailed错误描述在运行或构</div> </li> <li><a href="/article/109.htm" title="统一思想认识" target="_blank">统一思想认识</a> <span class="text-muted">永夜-极光</span> <a class="tag" taget="_blank" href="/search/%E6%80%9D%E6%83%B3/1.htm">思想</a> <div>1.统一思想认识的基础,才能有的放矢  原因:    总有一种描述事物的方式最贴近本质,最容易让人理解.    如何让教育更轻松,在于找到最适合学生的方式.          难点在于,如何模拟对方的思维基础选择合适的方式.   &</div> </li> <li><a href="/article/236.htm" title="Joda Time使用笔记" target="_blank">Joda Time使用笔记</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/joda+time/1.htm">joda time</a> <div>Joda Time的介绍可以参考这篇文章: http://www.ibm.com/developerworks/cn/java/j-jodatime.html 工作中也常常用到Joda Time,为了避免每次使用都查API,记录一下常用的用法:     /** * DateTime变化(增减) */ @Tes</div> </li> <li><a href="/article/363.htm" title="FileUtils API" target="_blank">FileUtils API</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/FileUtils/1.htm">FileUtils</a><a class="tag" taget="_blank" href="/search/FileUtils+API/1.htm">FileUtils API</a> <div>转载请出自出处:http://eksliang.iteye.com/blog/2217374 一、概述 这是一个Java操作文件的常用库,是Apache对java的IO包的封装,这里面有两个非常核心的类FilenameUtils跟FileUtils,其中FilenameUtils是对文件名操作的封装;FileUtils是文件封装,开发中对文件的操作,几乎都可以在这个框架里面找到。 非常的好用。 </div> </li> <li><a href="/article/490.htm" title="各种新兴技术" target="_blank">各种新兴技术</a> <span class="text-muted">不懂事的小屁孩</span> <a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF/1.htm">技术</a> <div>1:gradle Gradle 是以 Groovy 语言为基础,面向Java应用为主。基于DSL(领域特定语言)语法的自动化构建工具。 现在构建系统常用到maven工具,现在有更容易上手的gradle, 搭建java环境: http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ 搭建android环境: http://m</div> </li> <li><a href="/article/617.htm" title="tomcat6的https双向认证" target="_blank">tomcat6的https双向认证</a> <span class="text-muted">酷的飞上天空</span> <a class="tag" taget="_blank" href="/search/tomcat6/1.htm">tomcat6</a> <div>1.生成服务器端证书 keytool -genkey -keyalg RSA -dname "cn=localhost,ou=sango,o=none,l=china,st=beijing,c=cn" -alias server -keypass password -keystore server.jks -storepass password -validity 36</div> </li> <li><a href="/article/744.htm" title="托管虚拟桌面市场势不可挡" target="_blank">托管虚拟桌面市场势不可挡</a> <span class="text-muted">蓝儿唯美</span> <div>用户还需要冗余的数据中心,dinCloud的高级副总裁兼首席营销官Ali Din指出。该公司转售一个MSP可以让用户登录并管理和提供服务的用于DaaS的云自动化控制台,提供服务或者MSP也可以自己来控制。 在某些情况下,MSP会在dinCloud的云服务上进行服务分层,如监控和补丁管理。 MSP的利润空间将根据其参与的程度而有所不同,Din说。 “我们有一些合作伙伴负责将我们推荐给客户作为个</div> </li> <li><a href="/article/871.htm" title="spring学习——xml文件的配置" target="_blank">spring学习——xml文件的配置</a> <span class="text-muted">a-john</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>在Spring的学习中,对于其xml文件的配置是必不可少的。在Spring的多种装配Bean的方式中,采用XML配置也是最常见的。以下是一个简单的XML配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.or</div> </li> <li><a href="/article/998.htm" title="HDU 4342 History repeat itself 模拟" target="_blank">HDU 4342 History repeat itself 模拟</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/%E6%A8%A1%E6%8B%9F/1.htm">模拟</a> <div>来源:http://acm.hdu.edu.cn/showproblem.php?pid=4342 题意:首先让求第几个非平方数,然后求从1到该数之间的每个sqrt(i)的下取整的和。 思路:一个简单的模拟题目,但是由于数据范围大,需要用__int64。我们可以首先把平方数筛选出来,假如让求第n个非平方数的话,看n前面有多少个平方数,假设有x个,则第n个非平方数就是n+x。注意两种特殊情况,即</div> </li> <li><a href="/article/1125.htm" title="java中最常用jar包的用途" target="_blank">java中最常用jar包的用途</a> <span class="text-muted">asia007</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>java中最常用jar包的用途 jar包用途axis.jarSOAP引擎包commons-discovery-0.2.jar用来发现、查找和实现可插入式接口,提供一些一般类实例化、单件的生命周期管理的常用方法.jaxrpc.jarAxis运行所需要的组件包saaj.jar创建到端点的点到点连接的方法、创建并处理SOAP消息和附件的方法,以及接收和处理SOAP错误的方法.  w</div> </li> <li><a href="/article/1252.htm" title="ajax获取Struts框架中的json编码异常和Struts中的主控制器异常的解决办法" target="_blank">ajax获取Struts框架中的json编码异常和Struts中的主控制器异常的解决办法</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/json%E7%BC%96%E7%A0%81%E8%BF%94%E5%9B%9E%E5%BC%82%E5%B8%B8/1.htm">json编码返回异常</a> <div>一:ajax获取自定义Struts框架中的json编码  出现以下 问题:       1,强制flush输出  json编码打印在首页 2, 不强制flush js会解析json 打印出来的是错误的jsp页面   却没有跳转到错误页面 3,  ajax中的dataType的json 改为text 会</div> </li> <li><a href="/article/1379.htm" title="JUnit使用的设计模式" target="_blank">JUnit使用的设计模式</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/JUnit/1.htm">JUnit</a> <div>JUnit源代码涉及使用了大量设计模式 1、模板方法模式(Template Method)         定义一个操作中的算法骨架,而将一些步骤延伸到子类中去,使得子类可以不改变一个算法的结构,即可重新定义该算法的某些特定步骤。这里需要复用的是算法的结构,也就是步骤,而步骤的实现可以在子类中完成。   </div> </li> <li><a href="/article/1506.htm" title="Linux常用命令(摘录)" target="_blank">Linux常用命令(摘录)</a> <span class="text-muted">sunjing</span> <a class="tag" taget="_blank" href="/search/crond/1.htm">crond</a><a class="tag" taget="_blank" href="/search/chkconfig/1.htm">chkconfig</a> <div>chkconfig --list   查看linux所有服务 chkconfig --add servicename 添加linux服务 netstat -apn | grep 8080  查看端口占用 env 查看所有环境变量 echo $JAVA_HOME 查看JAVA_HOME环境变量   安装编译器 yum install -y gcc</div> </li> <li><a href="/article/1633.htm" title="【Hadoop一】Hadoop伪集群环境搭建" target="_blank">【Hadoop一】Hadoop伪集群环境搭建</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div> 结合网上多份文档,不断反复的修正hadoop启动和运行过程中出现的问题,终于把Hadoop2.5.2伪分布式安装起来,跑通了wordcount例子。Hadoop的安装复杂性的体现之一是,Hadoop的安装文档非常多,但是能一个文档走下来的少之又少,尤其是Hadoop不同版本的配置差异非常的大。Hadoop2.5.2于前两天发布,但是它的配置跟2.5.0,2.5.1没有分别。 &nb</div> </li> <li><a href="/article/1760.htm" title="Anychart图表系列五之事件监听" target="_blank">Anychart图表系列五之事件监听</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/chart/1.htm">chart</a> <div>创建图表事件监听非常简单:首先是通过addEventListener('监听类型',js监听方法)添加事件监听,然后在js监听方法中定义具体监听逻辑。 以钻取操作为例,当用户点击图表某一个point的时候弹出point的name和value,代码如下: <script> //创建AnyChart var chart = new AnyChart(); //添加钻取操作&quo</div> </li> <li><a href="/article/1887.htm" title="Web前端相关段子" target="_blank">Web前端相关段子</a> <span class="text-muted">braveCS</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF/1.htm">web前端</a> <div>Web标准:结构、样式和行为分离   使用语义化标签 0)标签的语义:使用有良好语义的标签,能够很好地实现自我解释,方便搜索引擎理解网页结构,抓取重要内容。去样式后也会根据浏览器的默认样式很好的组织网页内容,具有很好的可读性,从而实现对特殊终端的兼容。 1)div和span是没有语义的:只是分别用作块级元素和行内元素的区域分隔符。当页面内标签无法满足设计需求时,才会适当添加div</div> </li> <li><a href="/article/2014.htm" title="编程之美-24点游戏" target="_blank">编程之美-24点游戏</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a> <div> import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set; public class PointGame { /**编程之美 </div> </li> <li><a href="/article/2141.htm" title="主页面子页面传值总结" target="_blank">主页面子页面传值总结</a> <span class="text-muted">chengxuyuancsdn</span> <a class="tag" taget="_blank" href="/search/%E6%80%BB%E7%BB%93/1.htm">总结</a> <div>1、showModalDialog returnValue是javascript中html的window对象的属性,目的是返回窗口值,当用window.showModalDialog函数打开一个IE的模式窗口时,用于返回窗口的值 主界面 var sonValue=window.showModalDialog("son.jsp"); 子界面 window.retu</div> </li> <li><a href="/article/2268.htm" title="[网络与经济]互联网+的含义" target="_blank">[网络与经济]互联网+的含义</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91%2B/1.htm">互联网+</a> <div>       互联网+后面是一个人的名字 = 网络控制系统       互联网+你的名字 =  网络个人数据库       每日提示:如果人觉得不舒服,千万不要外出到处走动,就呆在床上,玩玩手游,更不能够去开车,现在交通状况不</div> </li> <li><a href="/article/2395.htm" title="oracle 创建视图 with check option" target="_blank">oracle 创建视图 with check option</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/%E8%A7%86%E5%9B%BE/1.htm">视图</a><a class="tag" taget="_blank" href="/search/view/1.htm">view</a><a class="tag" taget="_blank" href="/search/oralce/1.htm">oralce</a> <div>我们来看下面的例子: create or replace view testview as select empno,ename from emp where ename like ‘M%’ with check option; 这里我们创建了一个视图,并使用了with check option来限制了视图。 然后我们来看一下视图包含的结果: select * from testv</div> </li> <li><a href="/article/2522.htm" title="ToastPlugin插件在cordova3.3下使用" target="_blank">ToastPlugin插件在cordova3.3下使用</a> <span class="text-muted">dibov</span> <a class="tag" taget="_blank" href="/search/Cordova/1.htm">Cordova</a> <div>    自己开发的Todos应用,想实现“ 再按一次返回键退出程序 ”的功能,采用网上的ToastPlugins插件,发现代码或文章基本都是老版本,运行问题比较多。折腾了好久才弄好。下面吧基于cordova3.3下的ToastPlugins相关代码共享。       ToastPlugin.java package&nbs</div> </li> <li><a href="/article/2649.htm" title="C语言22个系统函数" target="_blank">C语言22个系统函数</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/function/1.htm">function</a> <div>C语言系统函数一、数学函数下列函数存放在math.h头文件中Double floor(double num) 求出不大于num的最大数。Double fmod(x, y) 求整数x/y的余数。Double frexp(num, exp); double num; int *exp; 将num分为数字部分(尾数)x和 以2位的指数部分n,即num=x*2n,指数n存放在exp指向的变量中,返回x。D</div> </li> <li><a href="/article/2776.htm" title="开发一个类的流程" target="_blank">开发一个类的流程</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91/1.htm">开发</a> <div>本人近日根据自己的开发经验总结了一个类的开发流程。这个流程适用于单独开发的构件,并不适用于对一个项目中的系统对象开发。开发出的类可以存入私人类库,供以后复用。   以下是开发流程: 1. 明确类的功能,抽象出类的大概结构 2. 初步设想类的接口 3. 类名设计(驼峰式命名) 4. 属性设置(权限设置) 判断某些变量是否有必要作为成员属</div> </li> <li><a href="/article/2903.htm" title="java 并发" target="_blank">java 并发</a> <span class="text-muted">shuizhaosi888</span> <a class="tag" taget="_blank" href="/search/java+%E5%B9%B6%E5%8F%91/1.htm">java 并发</a> <div>能够写出高伸缩性的并发是一门艺术   在JAVA SE5中新增了3个包 java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks 在java的内存模型中,类的实例字段、静态字段和构成数组的对象元素都会被多个线程所共享,局部变量与方法参数都是线程私有的,不会被共享。 </div> </li> <li><a href="/article/3030.htm" title="Spring Security(11)——匿名认证" target="_blank">Spring Security(11)——匿名认证</a> <span class="text-muted">234390216</span> <a class="tag" taget="_blank" href="/search/Spring+Security/1.htm">Spring Security</a><a class="tag" taget="_blank" href="/search/ROLE_ANNOYMOUS/1.htm">ROLE_ANNOYMOUS</a><a class="tag" taget="_blank" href="/search/%E5%8C%BF%E5%90%8D/1.htm">匿名</a> <div>匿名认证 目录 1.1     配置 1.2     AuthenticationTrustResolver          对于匿名访问的用户,Spring Security支持为其建立一个匿名的AnonymousAuthenticat</div> </li> <li><a href="/article/3157.htm" title="NODEJS项目实践0.2[ express,ajax通信...]" target="_blank">NODEJS项目实践0.2[ express,ajax通信...]</a> <span class="text-muted">逐行分析JS源代码</span> <a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/nodejs/1.htm">nodejs</a><a class="tag" taget="_blank" href="/search/express/1.htm">express</a> <div>  一、前言         通过上节学习,我们已经        ubuntu系统搭建了一个可以访问的nodejs系统,并做了nginx转发。本节原要做web端服务 及 mongodb的存取,但写着写着,web端就</div> </li> <li><a href="/article/3284.htm" title="在Struts2 的Action中怎样获取表单提交上来的多个checkbox的值" target="_blank">在Struts2 的Action中怎样获取表单提交上来的多个checkbox的值</a> <span class="text-muted">lhbthanks</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a><a class="tag" taget="_blank" href="/search/checkbox/1.htm">checkbox</a> <div>第一种方法:获取结果String类型 在 Action 中获得的是一个 String 型数据,每一个被选中的 checkbox 的 value 被拼接在一起,每个值之间以逗号隔开(,)。 所以在 Action 中定义一个跟 checkbox 的 name 同名的属性来接收这些被选中的 checkbox 的 value 即可。 以下是实现的代码: 前台 HTML 代码: </div> </li> <li><a href="/article/3411.htm" title="003.Kafka基本概念" target="_blank">003.Kafka基本概念</a> <span class="text-muted">nweiren</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a> <div>Kafka基本概念:Topic、Partition、Message、Producer、Broker、Consumer。 Topic:             消息源(Message)的分类。 Partition:             Topic物理上的分组,一</div> </li> <li><a href="/article/3538.htm" title="Linux环境下安装JDK" target="_blank">Linux环境下安装JDK</a> <span class="text-muted">roadrunners</span> <a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>1、准备工作 创建JDK的安装目录: mkdir -p /usr/java/   下载JDK,找到适合自己系统的JDK版本进行下载: http://www.oracle.com/technetwork/java/javase/downloads/index.html   把JDK安装包下载到/usr/java/目录,然后进行解压: tar -zxvf jre-7</div> </li> <li><a href="/article/3665.htm" title="Linux忘记root密码的解决思路" target="_blank">Linux忘记root密码的解决思路</a> <span class="text-muted">tomcat_oracle</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>1:使用同版本的linux启动系统,chroot到忘记密码的根分区passwd改密码   2:grub启动菜单中加入init=/bin/bash进入系统,不过这时挂载的是只读分区。根据系统的分区情况进一步判断.   3: grub启动菜单中加入 single以单用户进入系统.   4:用以上方法mount到根分区把/etc/passwd中的root密码去除   例如:   ro</div> </li> <li><a href="/article/3792.htm" title="跨浏览器 HTML5 postMessage 方法以及 message 事件模拟实现" target="_blank">跨浏览器 HTML5 postMessage 方法以及 message 事件模拟实现</a> <span class="text-muted">xueyou</span> <a class="tag" taget="_blank" href="/search/jsonp/1.htm">jsonp</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/UI/1.htm">UI</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a> <div>postMessage 是 HTML5 新方法,它可以实现跨域窗口之间通讯。到目前为止,只有 IE8+, Firefox 3, Opera 9, Chrome 3和 Safari 4 支持,而本篇文章主要讲述 postMessage 方法与 message 事件跨浏览器实现。postMessage 方法 JSONP 技术不一样,前者是前端擅长跨域文档数据即时通讯,后者擅长针对跨域服务端数据通讯,p</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>