首页 文章 精选 留言 我的

精选列表

搜索[计费相关],共10000篇文章
优秀的个人博客,低调大师

Java操作Windows剪切板相关函数示例

以下共有4个函数分别是: 1.从剪切板获得文字。 2.将字符串复制到剪切板。 3.从剪切板获得图片。 4.复制图片到剪切板。 [java] view plain copy /** *从剪切板获得文字。 */ publicstaticStringgetSysClipboardText(){ Stringret=""; ClipboardsysClip=Toolkit.getDefaultToolkit().getSystemClipboard(); //获取剪切板中的内容 TransferableclipTf=sysClip.getContents(null); if(clipTf!=null){ //检查内容是否是文本类型 if(clipTf.isDataFlavorSupported(DataFlavor.stringFlavor)){ try{ ret=(String)clipTf .getTransferData(DataFlavor.stringFlavor); }catch(Exceptione){ e.printStackTrace(); } } } returnret; } /** *将字符串复制到剪切板。 */ publicstaticvoidsetSysClipboardText(StringwriteMe){ Clipboardclip=Toolkit.getDefaultToolkit().getSystemClipboard(); TransferabletText=newStringSelection(writeMe); clip.setContents(tText,null); } /** *从剪切板获得图片。 */ publicstaticImagegetImageFromClipboard()throwsException{ Clipboardsysc=Toolkit.getDefaultToolkit().getSystemClipboard(); Transferablecc=sysc.getContents(null); if(cc==null) returnnull; elseif(cc.isDataFlavorSupported(DataFlavor.imageFlavor)) return(Image)cc.getTransferData(DataFlavor.imageFlavor); returnnull; } /** *复制图片到剪切板。 */ publicstaticvoidsetClipboardImage(finalImageimage){ Transferabletrans=newTransferable(){ publicDataFlavor[]getTransferDataFlavors(){ returnnewDataFlavor[]{DataFlavor.imageFlavor}; } publicbooleanisDataFlavorSupported(DataFlavorflavor){ returnDataFlavor.imageFlavor.equals(flavor); } publicObjectgetTransferData(DataFlavorflavor) throwsUnsupportedFlavorException,IOException{ if(isDataFlavorSupported(flavor)) returnimage; thrownewUnsupportedFlavorException(flavor); } }; Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null); }

优秀的个人博客,低调大师

Android插件化开发核心类ClassLoader相关详解

最近在研究插件化开发,顺便就了解了 ClassLoader 这个类加载器,顺藤摸瓜,查到了jvm里面的双亲委派模型,这里就简单的讲一下什么是预定义类加载器和双亲委派模型? 学好java基础,顺便学好jvm虚拟机,对阅读源码和插件化开发很有帮助。 1、预定义类加载器 JVM预定义的三种类型类加载器: 1.启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib 下面的类库加载到内存中(比如 rt.jar)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。 2.标准扩展(Extension)类加载器:是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将 < Java_Runtime_Home >/lib/ext 或者由系统变量 java.ext.dir 指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。 3.系统(System)类加载器:是由 Sun 的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。由于这个类加载器是 ClassLoader 中的 getSystemClassLoader() 方法的返回值,所以一般也被称为系统类加载器。它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。 除了以上列举的三种类加载器,还有一种比较特殊的类型 — 线程上下文类加载器。 应用程序由这三种类加载器互相配合进行加载的,如果有必须,还可以加入自己定义的类加载器。这些类加载器之间的关系一般如下图: 类加载器之间的关系 2、双亲委派模型(双亲委派机制) 双亲委派模型要求除了顶层的启动类加载器之外,其余的类加载器都应当有自己的父类加载器。这里的类加载器之间的父子关系一般不会以继承的关系来实现,而是使用组合关系来复用父加载器的代码。 双亲委派模型的式作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完全这个加载请求时,子加载器才会尝试自己去加载。 3、双亲委派模型的破坏 1、第1次“被破坏” 双亲委派模型的第一次“被破坏”其实发生在双亲委派模型出现之前--即JDK1.2发布之前。由于双亲委派模型是在JDK1.2之后才被引入的,而类加载器和抽象类 java.lang.ClassLoader 则是JDK1.0时候就已经存在,面对已经存在 的用户自定义类加载器的实现代码,Java设计者引入双亲委派模型时不得不做出一些妥协。为了向前兼容,JDK1.2之后的 java.lang.ClassLoader 添加了一个新的 proceted 方法 findClass() ,在此之前,用户去继承 java.lang.ClassLoader 的唯一目的就是重写 loadClass() 方法,因为虚拟在进行类加载的时候会调用加载器的私有方法 loadClassInternal(),而这个方法的唯一逻辑就是去调用自己的 loadClass() 。JDK1.2之后已不再提倡用户再去覆盖 loadClass() 方法,应当把自己的类加载逻辑写到 findClass() 方法中,在 loadClass() 方法的逻辑里,如果父类加载器加载失败,则会调用自己的findClass()方法来完成加载,这样就可以保证新写出来的类加载器是符合双亲委派模型的。 2、第2次“被破坏” 双亲委派模型的第二次“被破坏”是这个模型自身的缺陷所导致的,双亲委派模型很好地解决了各个类加载器的基础类统一问题(越基础的类由越上层的加载器进行加载),基础类之所以被称为“基础”,是因为它们总是作为被调用代码调用的API。但是,如果基础类又要调用用户的代码,那该怎么办呢。 这并非是不可能的事情,一个典型的例子便是JNDI服务,它的代码由启动类加载器去加载(在JDK1.3时放进 rt.jar ),但JNDI的目的就是对资源进行集中管理和查找,它需要调用独立厂商实现部部署在应用程序的classpath下的JNDI接口提供者 (SPI, Service Provider Interface) 的代码,但启动类加载器不可能“认识”之些代码,该怎么办? 为了解决这个困境,Java设计团队只好引入了一个不太优雅的设计:线程上下文件类加载器(Thread Context ClassLoader)。这个类加载器可以通过 java.lang.Thread 类的 setContextClassLoader() 方法进行设置,如果创建线程时还未设置,它将会从父线程中继承一个;如果在应用程序的全局范围内都没有设置过,那么这个类加载器默认就是应用程序类加载器。了有线程上下文类加载器,JNDI服务使用这个线程上下文类加载器去加载所需要的SPI代码,也就是父类加载器请求子类加载器去完成类加载动作,这种行为实际上就是打通了双亲委派模型的层次结构来逆向使用类加载器,已经违背了双亲委派模型,但这也是无可奈何的事情。Java中所有涉及SPI的加载动作基本上都采用这种方式,例如JNDI,JDBC,JCE,JAXB和JBI等。 3、第3次“被破坏” 双亲委派模型的第三次“被破坏”是由于用户对程序的动态性的追求导致的,例如OSGi的出现。在OSGi环境下,类加载器不再是双亲委派模型中的树状结构,而是进一步发展为网状结构。 4、几点思考 1、Bootstrap类 Java虚拟机的第一个类加载器是Bootstrap,这个加载器很特殊,它不是Java类,因此它不需要被别人加载,它嵌套在Java虚拟机内核里面,也就是JVM启动的时候Bootstrap就已经启动,它是用C++写的二进制代码(不是字节码),它可以去加载别的类。 这也是我们在测试时为什么发现System.class.getClassLoader()结果为null的原因,这并不表示System这个类没有类加载器,而是它的加载器比较特殊,是BootstrapClassLoader,由于它不是Java类,因此获得它的引用肯定返回null。 2、委托机制具体含义 当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢? 首先当前线程的类加载器去加载线程中的第一个类(假设为类A)。 注:当前线程的类加载器可以通过Thread类的getContextClassLoader()获得,也可以通过setContextClassLoader()自己设置类加载器。 如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器去加载类B。 还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。 3、委托机制的意义 — 防止内存中出现多份同样的字节码 比如两个类A和类B都要加载System类: 如果不用委托而是自己加载自己的,那么类A就会加载一份System字节码,然后类B又会加载一份System字节码,这样内存中就出现了两份System字节码。 如果使用委托机制,会递归的向父类查找,也就是首选用Bootstrap尝试加载,如果找不到再向下。这里的System就能在Bootstrap中找到然后加载,如果此时类B也要加载System,也从Bootstrap开始,此时Bootstrap发现已经加载过了System那么直接返回内存中的System即可而不需要重新加载,这样内存中就只有一份System的字节码了。 5、一道面试题:能不能自己写个类叫java.lang.System? 答案: 通常不可以,但可以采取另类方法达到这个需求。 解释: 为了不让我们写System类,类加载采用委托机制,这样可以保证爸爸们优先,爸爸们能找到的类,儿子就没有机会加载。而System类是Bootstrap加载器加载的,就算自己重写,也总是使用Java系统提供的System,自己写的System类根本没有机会得到加载。 但是,我们可以自己定义一个类加载器来达到这个目的,为了避免双亲委托机制,这个类加载器也必须是特殊的。由于系统自带的三个类加载器都加载特定目录下的类,如果我们自己的类加载器放在一个特殊的目录,那么系统的加载器就无法加载,也就是最终还是由我们自己的加载器加载。 参考文章: 深入理解Java虚拟机笔记---双亲委派模型关于Java类加载双亲委派机制的思考(附一道面试题)

优秀的个人博客,低调大师

4.4、Libgdx用法查询执行环境相关性

(原版的:http://www.libgdx.cn/topic/46/4-4-libgdx%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E6%9F%A5%E8%AF%A2%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83%E7%9B%B8%E5%85%B3%E5%B1%9E%E6%80%A7) Application接口提供了多种方法查询执行环境的属性。 获取当前应用类型 有时候须要依据特定平台进行特别的操作。Application.getType()用来返回当前正在执行的平台,示比例如以下: switch (Gdx.app.getType()) { case Android: // android specific code break; case Desktop: // desktop specific code break; case WebGl: // HTML5 specific code break; default: // Other platforms specific code } 在Android中,还能够查询当前Android的版本号: int androidVersion = Gdx.app.getVersion(); 这将返回当前使用的SDK版本号。比方3相应Android1.5。 (www.libgdx.cn版权所有所有。如需转载。注明出处) 版权声明:本文博客原创文章。博客,未经同意,不得转载。 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4681095.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android——进程通信/ AIDL/Message相关知识总结贴

Android 多进程通信 http://www.apkbus.com/android-83462-1-1.html Android 跨进程通信(一) http://www.apkbus.com/android-2393-1-1.html Android 跨进程通信(二) http://www.apkbus.com/android-2394-1-1.html Android 中 AIDL 实现(跨进程通信) http://www.apkbus.com/android-15211-1-1.html Android 进程间通信 http://www.apkbus.com/android-91355-1-1.html Android 系统进程间通信 Binder 机制 http://www.apkbus.com/android-112500-1-1.html 使用AIDL实现进程间的通信 http://www.apkbus.com/android-114839-1-1.html Android进程间通信(IPC)机制Binder简要介绍和学习计划 http://www.apkbus.com/android-99739-1-1.html 服务组件的进程间通信模型 http://www.apkbus.com/android-83850-1-1.html 使用AIDL实现进程间的通信之复杂类型传递 http://www.apkbus.com/android-114840-1-1.html 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client http://www.apkbus.com/android-99743-1-1.html android 组件间的交互和进程间 IPC 通信 http://www.apkbus.com/android-20707-1-1.html Android 之 Binder与进程间通信 http://www.apkbus.com/android-43314-1-1.html Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析 http://www.apkbus.com/android-99747-1-1.html Android进程间通信--消息机制及IPC机制实现 http://www.apkbus.com/android-3944-1-1.html 本文转自qianqianlianmeng博客园博客,原文链接:http://www.cnblogs.com/aimeng/p/3298609.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

人脸图像处理技术分析及相关行业应用

针对高密度人流量区域的安全管理,人脸布控系统以其短时间内实现多目标人脸抓取、识别检测的高效性能奠定了在行业领域不可取代的地位,不过,由于现阶段传统的监控系统大部分依旧存在图像清晰度低的缺陷,以及受光线、遮挡、年龄等因素的影响,导致系统在进行人脸识别过程时出现比对速度慢、对比结果不精确等,如何提升人脸识别的精准度成为人脸布控系统深化其应用价值的关键! 基于人脸识别技术的快速发展,现人脸布控系统在平安城市、交通、公安、金融、电力、司法、通信、酒店、展馆等行业已广泛应用,特别是通关口岸,车站,地铁站,机场等人流密集区域。人流量巨大,在这些人员密集区域进行人脸布控,可实现搜捕嫌疑犯、逃犯等功能,但是在实际应用中,人脸识别技术本身还有待进一步发展,特别是对于动态的人脸检测,夜景环境下,传统的监控系统依旧存在着大部分图像清晰度低的情况。现有的人脸识别方法对于人脸姿态变化、光照、表情、遮挡、年龄、模糊等一系列实际情况还需进一步提高,另外,由于人脸识别技术的实际应用实时性要求比较高,因此需要设计更高效更准确的识别算法,以便快速精准地识别犯罪分子,保证社会的长治久安。 常规的人脸识别流程为人脸检测、特征提取、人脸识别,在特征提取前先对人脸图像进行预处理,能有效的提高最终的识别效率及准确度。 人脸图像预处理技术 人脸图像预处理是基于人脸检测结果,对图像进行处理并最终服务于特征提取的过程。系统获取的原始图像由于受到各种条件的限制和随机干扰,往往不能直接使用,必须在图像处理的早期阶段对它进行灰度校正、噪声过滤等图像预处理。对于人脸图像而言,其预处理过程主要包括人脸图像的光线补偿、灰度变换、直方图均衡化、归一化、几何校正、滤波以及锐化等。 图像是人类获取信息、表达信息和传递信息的重要手段。利用计算机对图像进行去除噪声、增强、复原、分割、提取特征等的理论、方法和技术称为数字图像处理。 数字图像处理技术已经成为信息科学、计算机科学、工程科学、地球科学等诸多方面的学者研究图像的有效工具。数字图像处理主要包括图像变换、图像增强、图像编码、图像复原、图像重建、图像识别以及图像理解等内容。数字图像的边缘检测是图像分割、目标区域识别、区域形状提取等图像分析领域十分重要的基础,也是图像识别中提取图像特征的一个重要属性,边缘检测算子可以检查每个像素的邻域并对灰度变化率进行量化。 空域滤波按照空域滤波器的功能又可分为平滑滤波器和锐化滤波器。平滑滤波器可以用低通滤波实现,目的在于模糊图像或消除噪声;锐化滤波器是用高通滤波来实现,目的在于强调图像被模糊的细节。 光照不理想的情况下,为了把人脸区域从非人脸区域分割出来,需要使用适合不同肤色和不同光照条件的可靠的肤色模型。常用的RGB表示方法不适合于皮肤模型,在RGB空间,三基色(R、G、B)不仅代表颜色,还表示了亮度。由于周围环境光照的改变,亮度可能使人脸的检测变得更加复杂,在皮肤的分割过程中是不可靠的。为利用肤色在色度空间的聚类性,需要把颜色表达式中的色度信息与亮度信息分开,将R、G、B转换为色度与亮度分开的色彩表达空间可以解决这个问题。 RGB色彩系统用R、G、B三种基本颜色分量来表示数字图像像素的颜色值。我们非常熟悉的计算机屏幕的显示通常采用RGB色彩系统。这是最常见的色彩系统,RGB色系坐标中三维空间的三个轴分别与红、绿、蓝三基色相对应,原点对应于黑色,离原点最远的顶点对应于白色,其他颜色落在三维空间中由红、绿、蓝三基色组成的彩色立方体中。其他的色彩系统常以RGB色彩系统为基础,其分量可以描述为RGB三色的线性或非线性函数。RGB色彩系统通过色彩的相加来产生其他颜色,通常称为加色合成法。 当光照条件发生变化时,人脸的颜色也会发生一定的变化。实验表明,当待检测的图像亮度高于训练图像的亮度时,人脸大部分区域的颜色不会超过正常光照条件下人脸颜色的变化范围。但当待检测的人脸图像的亮度低于训练样本图像的亮度时,人脸颜色很可能超出正常光照条件下人脸颜色的变化范围。为了解决这一问题,就要对待检测的人脸图像进行光线补偿。光线补偿对于画面较暗的图像很有效,能极大提高后续肤色建模的效果。对于光线较暗的图片进行光线补偿可以很好地提高人脸肤色建模的效果。 在运动场景下,多数时候会抓拍到的只有半张脸的图片,使用对称补值的方式,能有效地为下一步特征提取补齐整张人脸的最低特征值,并进行有效识别;对于动态识别场景,往往出现人脸信息不全的情况,特别是对于疑犯等,都存在故意压低头或者侧脸方式行走,避免被监控抓拍到全脸的情况;使用半脸对称补值方式,有效地解决了此场景问题。 在一系列的预处理后,人脸识别的最终准确率及效率得到大幅度提升,且能适用更多的应用场景,对于原始已建设的安防系统,不需要二次的改造,不仅节约成本,也解决实际问题。 人脸识别技术在多领域的应用 人脸识别技术在多领域的应用 随着卷积神经网络深度学习的发展,以及人脸识别算法的多样化趋势,针对人物年龄、性别的识别技术也越来越成熟。通过对大量人物图片进行年龄和性别的标注,然后经过训练,便能得出很好的模型,原始数据训练得越多,模型的准确度也越高。深度学习的一些网络结构模拟人的大脑,通过网络的深度和卷积,目前在人脸识别领域达到很好的效果,而随着识别速度和精确度的不断加强,人脸识别在公安案件侦查、车站机场检票系统、住宅出入口管理、精准商业营销以及考场身份验证等多领域展开了多元化的行业应用。 公安行业的应用 为查询没有身份证件或证件资料假冒的犯罪嫌疑人的身份,为追捕疑犯、逃犯,提供了有效的多方位数据检索条件,这有利于快速锁定疑犯特性范围,对提高办案效率和破案成功率有很大帮助,也为目前公安使用的防伪可机读的第二代身份证提供了有力的技术保障。 车站自主检票应用 车站自动检票,应用人脸识别技术,在人脸识别系统机放置二代身份证,识别机器上屏幕的一边显示其个人信息与身份证照片,另一边显示摄像头拍摄的游客人脸照片。后台识别为同一人时,则播报“验证成功,请通过”;不通过,则报警提示,这样极大地节省了人工操作时间及人力成本。 家居行业的应用 随着生活质量的提高,人们对于智能化的要求越来越高。通过人脸识别技术,根据设定的布防策略,结合门禁的应用,对陌生人出入住宅进行自动报警或自动放行,给人们的居家安全提供保障。同时,它还可应用到住宅区、办公大楼安全管理等。 精准营销的应用 年龄、性别的识别融入到人脸识别应用后,对于商业化的数据挖掘起到推进作用,通过监控的区域部署人脸识别系统,分析不同性别及不同年龄在各种不同商场的喜好,能有效提供分段数据,为营销的下一步决策提供有力依据,精准营销可用于金铺、4S店、大商场等。 其它应用 考试地点,通过人脸识别,在入场拍照同时刷身份证验证,由系统后台进行智能化的人证比对,并对现场的作弊行为进行实时监控,有效减轻了考务人员的工作量,也降低了人工肉眼核对的出错率及人情因素隐患。 本文转自d1net(转载)

优秀的个人博客,低调大师

找免费WiFi不用愁 Facebook将出相关APP

想知道哪儿有免费的Wi-Fi?以后iPhone用户打开Facebook的APP或许就能很快地找到附近的公共免费Wi-Fi了。Facebook日前证实,他们将在iOS版APP中推出搜寻公共Wi-Fi的功能,不过该项功能目前仅支持iOS使用。 Facebook将在iOS版APP中推出搜寻公共Wi-Fi的功能 据了解,这项功能会藏在功能表的“设定”里,被称作“Find Wi-Fi(寻找Wi-Fi)”。用户在启用后,Facebook App就会自动搜寻附近的可用Wi-Fi,并呈现在地图上。不过,鉴于目前Facebook只在某些指定的国家内推出该功能,所以该应用尚无法全面有效。 “寻找免费Wi-Fi”或许也是Facebook继先前的无人机与卫星网络计划后,另一项提供上网途径的推广策略,同时目标用户也比较针对发展中国家的城市居民,而不是农村。3年前Facebook也曾与思科合作,为商家部署Wi-Fi。一旦用户在商家的粉丝团专页登录,就可以通过Facebook帐号,自动登入并使用店家的上网服务。 该寻找Wi-Fi的小工具,应该是通过Wi-Fi的信号强度,来反向判断无线热点的位置。实际上目前的手机也普遍会结合Wi-Fi热点的信号,来帮助进行GPS定位,因此Facebook的方法或许也是采用该理念而设计的应用。 不过,由于该功能操作的简便性,将能够侧面帮助实体商家展示广告,同时帮助Facebook APP构建出更多特色功能,来吸引新用户和提升老用户的粘性。但关于该应用的进一步演进,Facebook尚未给出更多介绍。 本文转自d1net(转载)

优秀的个人博客,低调大师

正确理解SQL Server配置timeout相关选项

正确理解SQL Server配置选项“remote login timeout”和“remote query timeout” 查看配置选项的设置 sp_configure 远程登录超时 参考:https://msdn.microsoft.com/en-us/library/ms175136.aspx “The remote login timeout option specifies the number of seconds to wait before returning from a failed attempt to log in to a remote server. For example, if you are trying to log in to a remote server and that server is down, remote login timeout helps make sure that you do not have to wait indefinitely before your computer stops trying to log in. The default value for this option is 10 seconds. A value of 0 allows for an infinite wait. The default value for this option is 20 seconds in SQL Server 2008. The remote login timeout option affects connections to OLE DB providers made for heterogeneous queries. The setting takes effect immediately without restarting the server.” EXECsp_configure'remotelogintimeout',35; GO RECONFIGURE; GO 远程查询超时 参考:https://msdn.microsoft.com/en-us/library/ms189040.aspx “The remote query timeout option specifies how long, in seconds, a remote operation can take before SQL Server times out. The default value for this option is 600, which allows a 10-minute wait. This value applies to an outgoing connection initiated by the Database Engine as a remote query. This value has no effect on queries received by the Database Engine. To disable the time-out, set the value to 0. A query will wait until it is canceled. For heterogeneous queries, remote query timeout specifies the number of seconds (initialized in the command object using the DBPROP_COMMANDTIMEOUT rowset property) that a remote provider should wait for result sets before the query times out. This value is also used to set DBPROP_GENERALTIMEOUT if supported by the remote provider. This will cause any other operations to time out after the specified number of seconds. For remote stored procedures, remote query timeout specifies the number of seconds that must elapse after sending a remote EXEC statement before the remote stored procedure times out. The setting takes effect immediately without restarting the server. ” EXECsp_configure'remotequerytimeout',0; GO RECONFIGURE; GO 远程服务器和链接服务器的对应选项 参考:https://msdn.microsoft.com/en-us/library/ms178532.aspx sp_serveroption[@server=]'server' ,[@optname=]'option_name' ,[@optvalue=]'option_value'; connect timeout Time-out valuein seconds for connecting to a linked server. If 0, use the sp_configure default. query timeout Time-out value for queries against a linked server. If 0, use the sp_configure default. 我只简单解释一句,这几个选项只是针对“outgoing connections”。

优秀的个人博客,低调大师

项目实战工具类(一):PhoneUtil(手机信息相关)

可以使用的功能: 1、获取手机系统版本号 2、获取手机型号 3、获取手机宽度 4、获取手机高度 5、获取手机imei串号 ,GSM手机的 IMEI 和 CDMA手机的 MEID. 6、获取手机sim卡号 7、获取手机号 8、判断sd卡是否挂载 9、获取sd卡剩余空间的大小 10、获取sd卡空间的总大小 11、判断是否是平板 12、判断一个apk是否安装 13、拨打电话 14、打开网页 15、获取应用权限 名称列表 16、获取手机内安装的应用 17、获取手机安装非系统应用 18、获取安装应用的信息 19、打开指定包名的应用 20、卸载指定包名的应用 21、手机号判断 工具类: 1 import java.io.File; 2 import java.util.ArrayList; 3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 6 import java.util.regex.Matcher; 7 import java.util.regex.Pattern; 8 9 import android.content.Context; 10 import android.content.Intent; 11 import android.content.pm.ApplicationInfo; 12 import android.content.pm.PackageInfo; 13 import android.content.pm.PackageManager; 14 import android.content.pm.PackageManager.NameNotFoundException; 15 import android.content.pm.PermissionGroupInfo; 16 import android.content.pm.PermissionInfo; 17 import android.content.pm.ResolveInfo; 18 import android.content.res.Configuration; 19 import android.net.Uri; 20 import android.os.Environment; 21 import android.os.StatFs; 22 import android.telephony.TelephonyManager; 23 import android.util.TypedValue; 24 import android.view.WindowManager; 25 26 public class PhoneUtil { 27 private static PhoneUtil phoneUtil; 28 29 public static PhoneUtil getInstance() { 30 if (phoneUtil == null) { 31 synchronized (PhoneUtil.class) { 32 if (phoneUtil == null) { 33 phoneUtil = new PhoneUtil(); 34 } 35 } 36 } 37 return phoneUtil; 38 } 39 40 /** 41 * 获取手机系统版本号 42 * 43 * @return 44 */ 45 public int getSDKVersionNumber() { 46 int sdkVersion; 47 try { 48 sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK_INT); 49 } catch (NumberFormatException e) { 50 e.printStackTrace(); 51 sdkVersion = 0; 52 } 53 return sdkVersion; 54 } 55 56 /** 57 * 获取手机型号 58 */ 59 public String getPhoneModel() { 60 return android.os.Build.MODEL; 61 } 62 63 /** 64 * 获取手机宽度 65 */ 66 @SuppressWarnings("deprecation") 67 public int getPhoneWidth(Context context) { 68 WindowManager wm = (WindowManager) context 69 .getSystemService(Context.WINDOW_SERVICE); 70 return wm.getDefaultDisplay().getWidth(); 71 } 72 73 /** 74 * 获取手机高度 75 * 76 * @param context 77 */ 78 @SuppressWarnings("deprecation") 79 public int getPhoneHeight(Context context) { 80 WindowManager wm = (WindowManager) context 81 .getSystemService(Context.WINDOW_SERVICE); 82 return wm.getDefaultDisplay().getHeight(); 83 } 84 85 /** 86 * 获取手机imei串号 ,GSM手机的 IMEI 和 CDMA手机的 MEID. 87 * 88 * @param context 89 */ 90 public String getPhoneImei(Context context) { 91 TelephonyManager tm = (TelephonyManager) context 92 .getSystemService(Context.TELEPHONY_SERVICE); 93 if (tm == null) 94 return null; 95 return tm.getDeviceId(); 96 } 97 98 /** 99 * 获取手机sim卡号 100 * 101 * @param context 102 */ 103 public String getPhoneSim(Context context) { 104 TelephonyManager tm = (TelephonyManager) context 105 .getSystemService(Context.TELEPHONY_SERVICE); 106 if (tm == null) 107 return null; 108 return tm.getSubscriberId(); 109 } 110 111 /** 112 * 获取手机号 113 * 114 * @param context 115 */ 116 public String getPhoneNum(Context context) { 117 TelephonyManager tm = (TelephonyManager) context 118 .getSystemService(Context.TELEPHONY_SERVICE); 119 if (tm == null) 120 return null; 121 return tm.getLine1Number(); 122 } 123 124 /** 125 * 判断sd卡是否挂载 126 */ 127 public boolean isSDCardMount() { 128 if (android.os.Environment.getExternalStorageState().equals( 129 android.os.Environment.MEDIA_MOUNTED)) { 130 return true; 131 } else { 132 return false; 133 } 134 } 135 136 /** 137 * 获取sd卡剩余空间的大小 138 */ 139 @SuppressWarnings("deprecation") 140 public long getSDFreeSize() { 141 File path = Environment.getExternalStorageDirectory(); // 取得SD卡文件路径 142 StatFs sf = new StatFs(path.getPath()); 143 long blockSize = sf.getBlockSize(); // 获取单个数据块的大小(Byte) 144 long freeBlocks = sf.getAvailableBlocks();// 空闲的数据块的数量 145 // 返回SD卡空闲大小 146 return (freeBlocks * blockSize) / 1024 / 1024; // 单位MB 147 } 148 149 /** 150 * 获取sd卡空间的总大小 151 */ 152 @SuppressWarnings("deprecation") 153 public long getSDAllSize() { 154 File path = Environment.getExternalStorageDirectory(); // 取得SD卡文件路径 155 StatFs sf = new StatFs(path.getPath()); 156 long blockSize = sf.getBlockSize(); // 获取单个数据块的大小(Byte) 157 long allBlocks = sf.getBlockCount(); // 获取所有数据块数 158 // 返回SD卡大小 159 return (allBlocks * blockSize) / 1024 / 1024; // 单位MB 160 } 161 162 /** 163 * 判断是否是平板 164 */ 165 public boolean isTablet(Context context) { 166 return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; 167 } 168 169 /** 170 * 判断一个apk是否安装 171 * 172 * @param context 173 * @param packageName 174 */ 175 public boolean isApkInstalled(Context context, String packageName) { 176 PackageManager pm = context.getPackageManager(); 177 try { 178 pm.getPackageInfo(packageName, 0); 179 } catch (PackageManager.NameNotFoundException e) { 180 return false; 181 } 182 return true; 183 } 184 185 /** 186 * 拨打电话 187 * 188 * @param context 189 * @param phoneNum 190 */ 191 public void call(Context context, String phoneNum) throws Exception { 192 if (phoneNum != null && !phoneNum.equals("")) { 193 Uri uri = Uri.parse("tel:" + phoneNum); 194 Intent intent = new Intent(Intent.ACTION_DIAL, uri); 195 context.startActivity(intent); 196 } 197 } 198 199 /** 200 * 打开网页 201 */ 202 public void openWeb(Context context, String url) { 203 try { 204 Uri uri = Uri.parse(url); 205 context.startActivity(new Intent(Intent.ACTION_VIEW, uri)); 206 } catch (Exception e) { 207 e.printStackTrace(); 208 } 209 } 210 211 /** 212 * 获取应用权限 名称列表 213 */ 214 public String[] getAppPermissions(Context context) 215 throws NameNotFoundException { 216 PackageManager pm = context.getPackageManager(); 217 PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 218 PackageManager.GET_PERMISSIONS); 219 return getAppPermissions(packageInfo); 220 } 221 222 public String[] getAppPermissions(PackageInfo packageInfo) 223 throws NameNotFoundException { 224 return packageInfo.requestedPermissions; 225 } 226 227 /** 228 * 获取手机内安装的应用 229 */ 230 public List<PackageInfo> getInstalledApp(Context context) { 231 PackageManager pm = context.getPackageManager(); 232 return pm.getInstalledPackages(0); 233 } 234 235 /** 236 * 获取手机安装非系统应用 237 */ 238 @SuppressWarnings("static-access") 239 public List<PackageInfo> getUserInstalledApp(Context context) { 240 List<PackageInfo> infos = getInstalledApp(context); 241 List<PackageInfo> apps = new ArrayList<PackageInfo>(); 242 for (PackageInfo info : infos) { 243 if ((info.applicationInfo.flags & info.applicationInfo.FLAG_SYSTEM) <= 0) { 244 apps.add(info); 245 } 246 } 247 infos.clear(); 248 infos = null; 249 return apps; 250 } 251 252 /** 253 * 获取安装应用的信息 254 */ 255 public Map<String, Object> getInstalledAppInfo(Context context, 256 PackageInfo info) { 257 Map<String, Object> appInfos = new HashMap<String, Object>(); 258 PackageManager pm = context.getPackageManager(); 259 ApplicationInfo aif = info.applicationInfo; 260 appInfos.put("icon", pm.getApplicationIcon(aif)); 261 appInfos.put("lable", pm.getApplicationLabel(aif)); 262 appInfos.put("packageName", aif.packageName); 263 return appInfos; 264 } 265 266 /** 267 * 打开指定包名的应用 268 */ 269 public void startAppPkg(Context context, String pkg) { 270 Intent startIntent = context.getPackageManager() 271 .getLaunchIntentForPackage(pkg); 272 startIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 273 context.startActivity(startIntent); 274 } 275 276 /** 277 * 卸载指定包名的应用 278 */ 279 public void unInstallApk(Context context, String packageName) { 280 Uri uri = Uri.parse("package:" + packageName); 281 Intent intent = new Intent(Intent.ACTION_DELETE); 282 intent.setData(uri); 283 context.startActivity(intent); 284 } 285 286 /** 287 * 手机号判断 288 */ 289 public static boolean isMobileNO(String mobile) { 290 Pattern p = Pattern 291 .compile("^((145|147)|(15[^4])|(17[0-9])|((13|18)[0-9]))\\d{8}$"); 292 Matcher m = p.matcher(mobile); 293 return m.matches(); 294 } 295 296 }

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册